C ++单例不同的实现(C++ different singleton implementation

2019-06-26 10:16发布

我通常实现Singleton模式是这样的:

class Singleton
{
    public:
        virtual ~Singleton() {}

        static Singleton& GetInstance()
        {
            static Singleton instance;
            return instance;
        }

    private:
        Singleton();
        Singleton(const Singleton&);
        Singleton& operator=(const Singleton&);
}

最近,我遇到了这个实施,这是稍有不同:

class Singleton
{
    public:
        Singleton();
        virtual ~Singleton() {}

        static Singleton& GetInstance()
        {
            return instance;
        }

    private:
        Singleton(const Singleton&);
        Singleton& operator=(const Singleton&);

        static Singleton instance;
}

Singleton Singleton::instance;

这实现更好?

是不是很危险不使构造私人(2日实施)?

谢谢。

Answer 1:

我无需重复关于其他的答案中作出的单身懒建设好点。

让我补充一点:

 public: Singleton(); virtual ~Singleton() {} 

这个特殊类的设计者觉得有必要让:

  • 从这个推导Singleton类,说的派生类被称为DerSingleton
  • DerSingleton可以具有可与指针将被删除实例Singleton (所以DerSingleton不是单)

的任何实例DerSingleton也是Singleton定义实例,因此可以得出,如果DerSingleton被实例化, Singleton是不是单身。

所以,这样的设计断言两两件事:

  • 这个类是单
  • 这个类不是


Answer 2:

它们是有区别的。 在第一种情况下instance在函数的第一个电话被初始化。 在第二种情况下程序启动时它被初始化。

如果你犯了一个public的构造-它不是一个singleton ,因为它是任何人都可以创建



Answer 3:

在行为上的主要差异会来,如果你尝试另一个命名空间级别的变量或类的静态成员的初始化过程中使用的单。 在第一种情况下,因为在第一个函数调用时需要创建实际的对象, 敷设渠道过程中的行为将被明确定义。 在第二种情况下,所有的赌注都关闭,由于从不同的翻译单元静态对象的初始化的相对顺序是不确定的。

同时还要注意,第一个是施工过程中的安全,它可能不是破坏时是。 也就是说,如果用静态存储持续时间的对象施工过程中不使用Singleton,也可能是单实例之前初始化。 破坏的顺序从建筑的顺序颠倒,并且在该特定情况下,将单其它对象之前被破坏。 如果该对象在使用它的析构函数的单,就会造成不确定的行为。



Answer 4:

第二种方案是错误的 。 默认构造函数应该是私有的。 因为它是,它不是一个单独本身。 除此之外,实现之间的差异@Andrew和@Brady答案被提及。



Answer 5:

两者之间的一个重要区别是,在第二个例子中实例的创建是线程安全的。

你是绝对正确的,虽然,构造函数应该是私有的。

这里有一个相关的问题: https://stackoverflow.com/a/10479084/1158895



文章来源: C++ different singleton implementations