我遇到了单身人士模式。 我无法理解
之间的区别singletonobj.getinstance().dosomething() //1st one
和
singletonobj.dosomething() //2nd one
getinstance()
做了什么,第二种情况没有做到?
答案 0 :(得分:9)
从技术上讲,singletonobj.getinstance()
是多余的,因为这意味着你已经抓住了这个对象。
通话看起来像是:
SingletonClass::getinstance().dosomething();
或
singletonobj.dosomething()
如果您预先取出对象 - 即之前已经
SingletonClass& singletonobj = SingletonClass::getinstance();
答案 1 :(得分:2)
首先,singletonobj
是一个错误/混淆的名称。单身人士在课堂上被召唤,例如:
Log::getInstance().doSomething();
而不是
Log log = new Log;
log.getInstance().doSomething();
所以这应该回答这个问题,但无论如何我都会详细说明:)
Log::doSomething();
会强制doSomething()
成为静态方法,而
Log::getInstance().doSomething();
将doSomething()
作为实例方法。
为什么要使用getInstance()
?因为单身,按其定义,应该只有零个或一个实例。通过使单例的构造函数为private并发布getInstance()
方法,它允许您控制该类的实例数。私有构造函数只是为了避免其他类来实例化这个类,这会破坏这个类作为单例的目的,因为你无法控制这个类的实例数。
class SingletonExample {
private:
static SingletonExample* instance = NULL;
SingletonExample() { }
public:
static SingletonExample getInstance() {
if (instance == NULL) {
instance = new SingletonExample;
}
return *instance;
}
void doSomething() {
// Do something :)
}
}
答案 2 :(得分:1)
看起来第一个例子是调用常规方法,而第二个例子是调用静态方法。
Singleton设计模式确保在任何给定时间只实例化给定对象的单个实例。第一个示例返回所述实例,然后使用对象的实例调用方法。
第二个例子似乎是使用一个不需要对象实例的静态方法,实际上使单例设计模式无效......