按照设计,在Singleton
模式中,构造函数应标记为private,并提供重新构建同一类型实例的私有静态成员的创建方法。我只创建了这样的单例类。
public class SingletonPattern {// singleton class
private static SingletonPattern pattern = new SingletonPattern();
private SingletonPattern() {
}
public static SingletonPattern getInstance() {
return pattern;
}
}
现在,我必须扩展一个单例类来添加新行为。但私有构造函数不允许定义子类。我正在考虑将默认构造函数更改为单例基类的受保护构造函数。
如果我将构造函数定义为protected
,那么可能会出现什么问题?
寻找专家意见....
答案 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;
}
}