单例类的确切用法和实现是什么?

what is the exact use and implementation of singleton class?

本文关键字:实现 是什么 用法 单例类      更新时间:2023-10-16

我知道单例类不允许创建多个对象。但是根据我下面的代码,我可以创建尽可能多的对象。

class Singleton
{
  private :
   static Singleton *m_Instance;
   Singleton()
   {
     cout<<"In defailt constructor"<<endl;
   }
   Singleton(int x)
   {
      i = x;
      cout<<"in param const"<<endl;
   }
 public:
   static int i;
   static Singleton* createInstance()
   {
      if(!m_Instance)
        m_Instance = new Singleton(20);
      Singleton sing;
      return m_Instance;
   }
};
int Singleton::i=0;
Singleton* Singleton::m_Instance = NULL;
int main()
{
    Singleton *pt = Singleton::createInstance();
    return 1;
}

在这里,我能够在静态函数中创建对象(因为我可以访问类中的构造函数),那么单对象的概念在哪里?

这不是单例,原因很简单,你故意写了一些不是单例的东西。

这个想法是,您编写instance函数,以便它只创建一个实例,并编写其他成员,以便它们不创建任何实例。然后,因为它们是唯一可以创建任何实例的函数,所以只有一个。

如果你删除狡猾的Singleton sing;,那么你将有一个单例实现-只有一个实例将被创建,第一次有人调用该函数。

与所有在c++中实现这种反模式的尝试一样,存在一些问题:对象永远不会被销毁,初始化不是线程安全的。还有其他各种方法,每种方法都有自己的缺点。我建议您完全避免使用全局变量,无论您是否将它们装扮成单例或其他反模式。

单对象的概念出现在你的代码中,每次你需要一个object的实例,而不是使用:

Singleton *myOwnSingleton=  new Singleton(20);

你应该总是使用:

Singleton *pt = Singleton::createInstance();

由于构造函数在类的外部是不可访问的,创建Singleton的唯一方法是通过Singleton::createInstance(),如果你阅读代码,只有我们第一次调用Singleton::createInstance()时才创建一个新的实例。
对该方法的所有后续调用都将返回已经创建的对象。因此,在所有的执行中,您将只创建一个实例。

但是当然……你应该删除

Singleton sing;

,因为它是对Singleton的错误使用。如果你创建一个叫做CAR的类,但是没有轮子…它不是一辆汽车。你创建了一个叫做singleton的类,但是。使用两个相同类型的对象。这不是美!