Design patterns 创建一个类的唯一实例(当有多个实现时)

Design patterns 创建一个类的唯一实例(当有多个实现时),design-patterns,singleton,Design Patterns,Singleton,假设我有两个类A1、A2,它们应该以不同的方式实现相同的功能(假设它们都实现了void f()方法) 在我的应用程序中,我一次只使用其中一个 public class AHolder { private static A instance; private AHolder() { } public synchronized static A getInstance() { if (instance == null) { if (Config.getAHold

假设我有两个类A1、A2,它们应该以不同的方式实现相同的功能(假设它们都实现了void f()方法)

在我的应用程序中,我一次只使用其中一个

public class AHolder {

 private static A instance;

 private AHolder() {
 }

  public synchronized static A getInstance() {
    if (instance == null) {
       if (Config.getAHolderType() == "A1") {
          instance = new A1();
       } else if (Config.getAHolderType() == "A2") {
          instance = new A2();
       } else {
         throw new IllegalStateException("class type not specified");
       } 
    }

   return instance;
  }
为此,我使用方法f()创建了一个接口A,并让A1和A2继承它

然后,我考虑创建一个名为AHolder的单例,它在任何给定的时间都只包含一个类(A1或A2)。AHolder将通过从配置中读取来确定其类的实例类型

问题是,我想以一种不允许创建多个类的方式实现这一点(即使我创建A1和A2单例-我仍然可以创建每个单例的一个实例-这意味着一个类的两个实例…)


有没有一种优雅的方法可以做到这一点?

这样,您一次只能有一个实例

public class AHolder {

 private static A instance;

 private AHolder() {
 }

  public synchronized static A getInstance() {
    if (instance == null) {
       if (Config.getAHolderType() == "A1") {
          instance = new A1();
       } else if (Config.getAHolderType() == "A2") {
          instance = new A2();
       } else {
         throw new IllegalStateException("class type not specified");
       } 
    }

   return instance;
  }

这样A1&A2的构造函数就必须是公共的。这意味着每个人都可以调用new A1()或new A2(),创建它的第二个实例……您可以将其包私有化……将AHolder、A1和A2放在同一个包中……并且不要将“public”放在A1和A2的构造函数上。这样,只有该包中的类才能实例化这些类。这是一个好主意,但它不会阻止某人(比如说另一个程序员)在处理特定包时实例化另一个类实例。。。我想知道是否有一种解决方案可以确保实例的唯一性(比如一种实例类型的单例模式)。如果你真的想在另一个级别强制执行,你可以自己创建A1和A2单例…这样,a文件夹就像一个工厂,只允许外部用户根据配置实例化正确的对象。你是对的,但是仍然有人可以同时实例化A1和A2。。。