singleton模式的用意是對於乙個class全域性只能建立乙個例項。常規的做法是把建構函式藏起來,然後通過靜態方法返回唯一的乙個靜態例項。
class singleton
}protected:
singleton()
}如果我們想讓singleton的子類也具有唯一性,只需要在getinstance中根據引數指定例項化哪乙個子類,就像gof中所寫的,不過這樣也只能例項化singleton的n多子類中的乙個,另乙個可替代的方法是查表。但是這樣的話,以後每增加乙個子類都需要修改表。
ogre中提供了一種方法可以解決這個問題。使用模版類和具化模版:
template
class singleton
~singleton( void )
static t& getsingleton( void )
static t* getsingletonptr( void )
};繼承於它的類:
class myclass :public singleton
做了兩件事,1.繼承;2.模版具化。對於singleton中的ms_singleton也宣告了它的型別,只不過還要重新定義:
template<> myclass* singleton:: ms_singleton = 0;
當你在試圖兩次例項化myclass,就會引起assert中斷,ogre這樣做是有目的的,因為它所有manager都是在root中new出來的。限制了不能在其它地方new,有利於結構的合理性。
另外ogre中對每個繼承於singleton的子類都抄寫了一遍getsingleton(void)和getsingletonptr(void)函式,這麼做是為了避免外界dll引用這個myclass發生連線錯誤:
myclass* myclass::getsingletonptr(void)
myclass & myclass::getsingleton(void)
--if (!ms_singleton)
--ms_singleton = static_cast( this );
--這樣new幾次也就是乙份例項。
如果直接使用new出來的物件(不通過getsingleton),就有可能使用的不是同一例項。而且多new幾次,不delete的話還會存在記憶體洩漏。
Singleton模式與在Ogre中的實現
singleton 模式的用意是對於乙個 class 全域性只能建立乙個例項。常規的做法是把建構函式藏起來,然後通過靜態方法返回唯一的乙個靜態例項。class singleton protected singleton 如果我們想讓 singleton 的子類也具有唯一性,只需要在 getinsta...
Singleton模式在C 與C 中的實現
singleton 應該可以算是 gof的 23個模式中最簡單的乙個模式了,它有兩個要求 一是保證乙個類僅有乙個例項 二是提供乙個訪問它的全域性訪問點。這在實現中分別對應為 一是建構函式非 public 二是提供乙個靜態函式作為全域性訪問點。在 c 中,我們可以這麼寫 public class ex...
Singleton模式在C 與C 中的實現
singleton 應該可以算是 gof的 23個模式中最簡單的乙個模式了,它有兩個要求 一是保證乙個類僅有乙個例項 二是提供乙個訪問它的全域性訪問點。這在實現中分別對應為 一是建構函式非 public 二是提供乙個靜態函式作為全域性訪問點。在c 中,我們可以這麼寫 public class exa...