我应该为我的单例类创建受保护的构造函数吗?

时间:2010-12-08 00:49:28

标签: java design-patterns singleton

按照设计,在Singleton模式中,构造函数应标记为private,并提供重新构建同一类型实例的私有静态成员的创建方法。我只创建了这样的单例类。

public class SingletonPattern {// singleton class

    private static SingletonPattern pattern = new SingletonPattern();

    private SingletonPattern() {

    }

    public static SingletonPattern getInstance() {
        return pattern;
    }

}

现在,我必须扩展一个单例类来添加新行为。但私有构造函数不允许定义子类。我正在考虑将默认构造函数更改为单例基类的受保护构造函数。

如果我将构造函数定义为protected,那么可能会出现什么问题?

寻找专家意见....

4 个答案:

答案 0 :(得分:6)

如果通过继承扩展单例类,如果有人抓住你的单例和原始单例,你将有2个单例类运行的实例。

如果原始单身在概念上确实应该是单身,那么使用构图可能是要走的路。但是,那么可替代性就会丢失(你的类不能替代原来的单例;它只是使用它)。

你有一个具体的例子吗?

答案 1 :(得分:1)

如果你这样做,那就不是单身人士了。但也许你真的不需要单身人士。

答案 2 :(得分:0)

这不是Singleton类。想象一下,我可以多次调用getInstance()静态方法,并且我可以拥有此类的n个对象,从而完全违反Singleton Pattern。要使它成为Singleton,你应该检查是否已经在getInstance()方法中创建了对象。如果已经创建,那么您应该忽略,不要再创建。例如,你可以这么类似的东西,请忽略语法错误,只需要一个代码来解释,可以在不同的语言中有所不同。

public class SingletonPattern {// singleton class

private static SingletonPattern pattern = new SingletonPattern();

private SingletonPattern() {

}

public static SingletonPattern getInstance() {
    if(SingletonPattern == null) {
        return new SingletonPattern();
    }
}

答案 3 :(得分:0)

老问题我知道,但碰巧偶然发现了这一点,并认为我可以添加一些有用的东西。

可以在单例类中拥有受保护的构造函数。如果您希望在Singleton上具有多态行为,可以将其设置为抽象类,将构造函数设置为protected,并将实例的创建委托给其中一个具体子类。

我在“设计模式解释”一书中找到了以下示例:

abstract public class Tax{
    static private Tax instance;

    protected Tax() {};

    abstract double calcTax( double qty, double price);

    public static Tax getInstance() {
      // code to determine what implementing class to use
      instance = USTax.getInstance();
      return instance;
    }
 }

public class USTax extends Tax {
     private static USTax instance;
     private USTax() {  
   // instantation local members +  Tax abstract class
 }

 public double calcTax ( double qty, double price){
   // implementation
 }

 public static Tax getInstance() {
     if(instance == null) 
        instance = new USTax();
     return instance;
  }
 }