Singleton模式與在Ogre中的實現

2021-05-12 15:33:39 字數 1470 閱讀 8391

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