2013-09-26 49 views
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; 
} 

主要的問題,我在此模式中找到的是實施析構函數,因爲每個實例都包含實例的向量,所以如果我刪除一個實例,我也刪除包含所有其他實例的向量。

是否有可能使這項工作?或者它只是一個錯誤的模式,簡單而簡單?

+0

一個單身人士應該是關於對象生命而不是階級設計。 – Simple

+0

在我看來,你只是想跟蹤有史以來創建的這個類的每個實例...沒有什麼錯。它用在一些流行的框架中(例如用於窗口)。在析構函數中,只需從列表中刪除它自己。順便說一下,不要使用矢量,使用地圖,以便更快地找到它。你可能想用一個互斥體來包裝它,以防在不同的線程中創建和銷燬實例。你在這裏得到的是一個窗口類(MFC,QT,WxWidget等,它們都使用相同的窗口模式)。 – thang

回答

2

我假設你知道辛格爾頓是一個壞設計的氣味。請參閱What is so bad about singletons?

要回答你的問題,你說得對「多個單身人士」的缺點是正確的。更好的設計是不是單身,其中變量是vector<A*>,或vector<unique_ptr<A>>如果你使用C++ 11(假設每個A不能被複制的,需要被實例化一次。否則,使用vector<A>

1

因爲每個實例都包含實例的向量,所以如果我刪除一個實例,我也刪除包含所有其他實例的向量。

由於您聲明瞭static,因此所有實例都不會存在vector<B*>

誰應該在實例中調用delete?通常使用你的技術,單例實例的析構函數永遠不會被調用。