我遇到过单例模式。我无法理解两者之间的区别
singletonobj.getinstance().dosomething() //1st one
和
singletonobj.dosomething() //2nd one
做什么getinstance()
,在第二种情况下没有做?
我遇到过单例模式。我无法理解两者之间的区别
singletonobj.getinstance().dosomething() //1st one
和
singletonobj.dosomething() //2nd one
做什么getinstance()
,在第二种情况下没有做?
好吧,从技术上讲,singletonobj.getinstance()
这是多余的,因为这意味着您已经掌握了该对象。
调用通常看起来像:
SingletonClass::getinstance().dosomething();
或者
singletonobj.dosomething()
如果您预取了对象 - 即以前做过
SingletonClass& singletonobj = SingletonClass::getinstance();
首先,singletonobj
是一个错误/令人困惑的名称。单例是基于类调用的,例如:
Log::getInstance().doSomething();
并不是
Log log = new Log;
log.getInstance().doSomething();
所以这应该回答这个问题,但无论如何我会详细说明:)
Log::doSomething();
将强制doSomething()
成为静态方法,而
Log::getInstance().doSomething();
有doSomething()
作为实例方法。
为什么使用getInstance()
?因为根据其定义,单例应该只有零个或一个实例。通过将单例的构造函数设为私有并发布该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 :)
}
}
看起来第一个示例调用的是常规方法,而第二个示例调用的是静态方法。
单例设计模式确保在任何给定时间仅实例化给定对象的单个实例。第一个示例返回所述实例,然后使用对象的实例调用方法。
第二个示例似乎使用了不需要对象实例的静态方法,并且实际上使单例设计模式无效......