在设计单例时,为什么构造函数是protected
而不是private
?这是基于我在网上看到的内容。
我们希望控制该类的实例数量,这是公平的,但为什么protected
? private
也不会做这个伎俩吗?
答案 0 :(得分:8)
首先,浩大大多数情况下的单身人士是个坏主意(Why?)。使用它们甚至更少而不是全局变量。
这样,子类可以对Singleton基类进行实例化,并将其作为自身GetInstance()
- 类型函数的一部分返回。这就是它在设计模式中完成的原因。因此,如果你计划继承Singleton,它只会真正相关。
GoF说,(第130页,对Singleton类进行子类化);
更灵活的方法是使用单例注册表。单例类可以在众所周知的注册表中按名称注册其单例实例,而不是让
Instance
定义可能的单例类集。
在使用单例注册表时,仍然需要基础Singleton中的protected
构造函数(根据给定的实现)
总之;如果您计划继承Singleton,请将其设为protected
。否则,请使用private
。
答案 1 :(得分:4)
使用单身人士很糟糕。周期。
那就是说,构造函数可以是私有的,没问题。但是如果你想从你的单身人士中衍生另一个单身人士(好像有一个单身人士还不够糟糕)怎么办?在这种情况下,派生类需要访问基本单例构造函数。
答案 2 :(得分:0)
这都是关于继承的。
class lazy_singleton: public singleton {};
将是与singleton构造函数相同的单例