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

时间:2015-05-21 10:18:07

标签: c++ design-patterns singleton

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

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;
}

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

2 个答案:

答案 0 :(得分:3)

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

这个想法是你编写instance函数,这样它只会创建一个实例,并编写其他成员,这样他们就不会创建任何实例。然后,由于它们是唯一可以创建任何实例的函数,因此只有一个。

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

与在C ++中实现此反模式的所有尝试一样,存在一些问题:对象永远不会被破坏,并且初始化不是线程安全的。存在各种其他方法,每种方法都有其自身的缺点。我建议你完全避免全局变量,无论你是否将它们打扮成单身人士或其他反模式。

答案 1 :(得分:1)

单个对象的概念出现在代码中,每当您需要Object的实例时,而不是使用:

Singleton *myOwnSingleton=  new Singleton(20);

您应该始终使用:

Singleton *pt = Singleton::createInstance();

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

但当然......你应该删除这行

Singleton sing;

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