singleton和经典构造函数

singleton and classic constructor

本文关键字:构造函数 经典 singleton      更新时间:2023-10-16

这个问题相当基础。我对我的cygwin进行了一个简单而直接的测试:

 class Example {
    public:
      Example(){ cout<<"dude..."<<endl; }
      ~Example(){ cout<<"see ya"<<endl; }
    public:
      static Example *GetInstance(){
        if(m_instance==NULL){
          m_instance = new Example();
          cout<<"watch out bro"<<endl;
        }
        return m_instance;
      }
    public:
       void exp(){cout<<"greetings"<<endl;}
    private:
       static Example *m_instance;
 };
 int main(){
   Example a;
   return 0;
  } 

显然,输出是:

 dude...
 greetings
 see ya

在c++编程中,从技术上讲,singleton和典型的构造函数是截然不同的,因为singleton将构造函数设置为私有的,而典型的方法则相反。在我最近的实习经历中,我注意到大多数程序员都是以这种方式实现API的。

我只是想知道,当两种类构造方法并行存在时,情况是这样还是没有必要。

更新

是构造函数&存在于一个程序中的singleton实际上是无稽之谈,因为这个范围内的singleton内容会变成无用的代码,就像不安全的垃圾一样?

摘要这是一个胡说八道的问题。。。更重要的是,感谢你们所有的天才构造函数和单例设计模式是"互斥的",就可修复性而言,这与全局变量杀死我们的调试时间是一样的。。。

通过公开Example的构造函数,您可以允许类的用户直接创建实例。如果您的设计只需要您的singleton的一个实例,那么这就允许用户无意中破坏这一要求。如果您将构造函数设为私有,那么调用GetInstance()将是创建Example对象的唯一方法,从而强制要求只允许创建一个实例。

请注意,静态对象的销毁顺序与创建它们的顺序相反。如果对象相互引用,则会导致问题。对于维护代码的人来说,这是一个陷阱,如果你有多个这样的对象,这很快就会变得难以管理。

许多开发人员认为单身是一件坏事,就像全局变量一样:

https://sites.google.com/site/steveyegge2/singleton-considered-stupid

当使用Singleton设计模式时,您应该始终将构造函数(也复制构造函数)和operator=设为私有,以确保给定类只有一个实例。否则,辛格尔顿模式就没有多大意义了。

我认为您错过了singleton的整个概念。Singleton意味着只有一个实例,但公共构造函数可以构造许多对象。

我认为这个例子已经被破坏了。它允许用户创建多个"singleton",然后很明显它们并没有singleton。

在singleton中,构造函数必须是私有的。

仅仅使构造函数私有并不能使类Singleton。为此,在调用构造函数之前,必须确保内存中没有其他实例。即使构造函数是私有的,也可以从静态类成员

创建任意数量的类实例Singleton是一种确保创建的类只有一个实例的技术。通过公开公共构造函数,您显然为多个实例打开了大门,因此您的类可能不会被称为singleton。

然而,它仍然有一个静态的GetInstance()方法,它在某种程度上被认为是一个单例接口,这让没有编写代码的人(甚至一段时间后的作者)感到困惑。