0

只是为了实验,我正在玩单例模式。我想知道是否可以扩展通常的单例类

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

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

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

4

2 回答 2

2

我假设你知道 Singleton 是一种糟糕的设计。看看单例有什么不好?

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

于 2013-09-26T10:27:46.880 回答
1

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

vector<B*>自您声明以来,所有实例都不会存在一次static

谁应该delete在什么时候调用你的实例?通常使用您的技术,单例实例的析构函数永远不会被调用。

于 2013-09-26T10:28:48.980 回答