getinstance()究竟在单身人士中做了什么?

时间:2012-10-03 11:27:52

标签: c++ design-patterns singleton

我遇到了单身人士模式。 我无法理解

之间的区别
singletonobj.getinstance().dosomething() //1st one

singletonobj.dosomething() //2nd one

getinstance()做了什么,第二种情况没有做到?

3 个答案:

答案 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设计模式确保在任何给定时间只实例化给定对象的单个实例。第一个示例返回所述实例,然后使用对象的实例调用方法。

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