3

我遇到过单例模式。我无法理解两者之间的区别

singletonobj.getinstance().dosomething() //1st one

singletonobj.dosomething() //2nd one

做什么getinstance(),在第二种情况下没有做?

4

3 回答 3

9

好吧,从技术上讲,singletonobj.getinstance()这是多余的,因为这意味着您已经掌握了该对象。

调用通常看起来像:

SingletonClass::getinstance().dosomething();

或者

singletonobj.dosomething()

如果您预取了对象 - 即以前做过

SingletonClass& singletonobj = SingletonClass::getinstance();
于 2012-10-03T11:34:01.760 回答
2

首先,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 :)
    }


}
于 2012-10-03T11:39:11.667 回答
1

看起来第一个示例调用的是常规方法,而第二个示例调用的是静态方法。

单例设计模式确保在任何给定时间仅实例化给定对象的单个实例。第一个示例返回所述实例,然后使用对象的实例调用方法。

第二个示例似乎使用了不需要对象实例的静态方法,并且实际上使单例设计模式无效......

于 2012-10-03T11:33:48.373 回答