getinstance() 在单例中到底做了什么

What exactly does getinstance() do in a singleton?

本文关键字:什么 单例中 getinstance      更新时间:2023-10-16

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

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 :)
    }

}

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

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

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