singleton
模式的用意是對於乙個
class
全域性只能建立乙個例項。常規的做法是把建構函式藏起來,然後通過靜態方法返回唯一的乙個靜態例項。
class
singleton }
protected
:singleton()
}如果我們想讓
singleton
的子類也具有唯一性,只需要在
getinstance
中根據引數指定例項化哪乙個子類,就像
gof中所寫的,不過這樣也只能例項化
singleton的n
多子類中的乙個,另乙個可替代的方法是查表。但是這樣的話,以後每增加乙個子類都需要修改表。
ogre
中提供了一種方法可以解決這個問題。使用模版類和具化模版:
template
t>
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的子類也具有唯一性,只需要在getinstance中根據...
Singleton模式在C 與C 中的實現
singleton 應該可以算是 gof的 23個模式中最簡單的乙個模式了,它有兩個要求 一是保證乙個類僅有乙個例項 二是提供乙個訪問它的全域性訪問點。這在實現中分別對應為 一是建構函式非 public 二是提供乙個靜態函式作為全域性訪問點。在 c 中,我們可以這麼寫 public class ex...
Singleton模式在C 與C 中的實現
singleton 應該可以算是 gof的 23個模式中最簡單的乙個模式了,它有兩個要求 一是保證乙個類僅有乙個例項 二是提供乙個訪問它的全域性訪問點。這在實現中分別對應為 一是建構函式非 public 二是提供乙個靜態函式作為全域性訪問點。在c 中,我們可以這麼寫 public class exa...