Singleton模式與在Ogre中的實現

2021-05-27 14:13:40 字數 1135 閱讀 4299

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...