仅仅是为了实验,我正在玩单身模式。我想知道是否有可能延长通常的单件类
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都包含实例的向量,因此,如果我删除一个实例,我也会删除包含所有其他实例的向量。
是否有可能使这项工作?或者它只是一个错误的模式,简单明了?
答案 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
您的实例?通常使用您的技术,单个实例的析构函数永远不会被调用。