我正在玩單身人士模式。我在想,如果它可能是可能爲了實驗的緣故,僞單身人員類別的多個實例
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;
}
主要的問題,我在此模式中找到的是實施析構函數,因爲每個實例都包含實例的向量,所以如果我刪除一個實例,我也刪除包含所有其他實例的向量。
是否有可能使這項工作?或者它只是一個錯誤的模式,簡單而簡單?
一個單身人士應該是關於對象生命而不是階級設計。 – Simple
在我看來,你只是想跟蹤有史以來創建的這個類的每個實例...沒有什麼錯。它用在一些流行的框架中(例如用於窗口)。在析構函數中,只需從列表中刪除它自己。順便說一下,不要使用矢量,使用地圖,以便更快地找到它。你可能想用一個互斥體來包裝它,以防在不同的線程中創建和銷燬實例。你在這裏得到的是一個窗口類(MFC,QT,WxWidget等,它們都使用相同的窗口模式)。 – thang