伪单例类的多个实例

时间:2013-09-26 10:15:38

标签: c++ singleton

仅仅是为了实验,我正在玩单身模式。我想知道是否有可能延长通常的单件类

class A
{
  private:
     static A* m_instance;
     A();
  public:
     static A* GetInstance();
}

A::A(){ ...some code}
A* A::m_instance = NULL;
A* A::GetInstance()
{
   if( m_instance == NULL ) m_instance = new A();
   return m_instance;
}

到“多单身”类,类似

class B
{
   private:
     static vector<B*> m_instances;
     B();
   public:
     static B* GetInstance( unsigned int n = 0);
     static B* GetNewInstance();
}

B* B::GetInstance( int n)
{
   if( n < m_instances.size() ) return m_instances.at(n);
   //Create a new instance and append it to m_instances
   B * temp = new B();
   m_instances.push_back( temp );
   return temp;
}

B* B::GetNewInstance()
{
   B * temp = new B();
   m_instances.push_back( temp );
   return temp;
}

我在这种模式中发现的主要问题是析构函数的实现,因为每个nstance都包含实例的向量,因此,如果我删除一个实例,我也会删除包含所有其他实例的向量。

是否有可能使这项工作?或者它只是一个错误的模式,简单明了?

2 个答案:

答案 0 :(得分:2)

我假设你知道Singleton有一个糟糕的设计气味。见What is so bad about singletons?

要回答你的问题,你对“多单身”的缺点是正确的。更好的设计将是变量为vector<A*>的单例,或者vector<unique_ptr<A>>如果您使用的是C ++ 11(假设每个A都无法复制并且需要实例化一次。否则使用vector<A>

答案 1 :(得分:1)

  

因为每个nstance都包含实例的向量,所以,如果我删除一个实例,我也会删除包含所有其他实例的向量。

所有实例都不存在vector<B*>,因为您已将其声明为static

谁应该在何时致电delete您的实例?通常使用您的技术,单个实例的析构函数永远不会被调用。