Ogre 設計模式之Singleton

2022-03-22 12:44:47 字數 2350 閱讀 7321

ogre很多地方採用了單件模式,單件模式的好處在於維護某個類在程式中只有唯一的例項,例項可以在程式的命名空間中的如何地方被直接呼叫,這樣就避免了對例項指標的傳遞。

logmanager,controllermanager,dylibmanager等都是使用的單例模式。

既然知道了單例模式的好處和ogre的廣泛用途,少年你肯定想知道ogre的singleton是如果實現的吧。下面我們結合logmanager來對它研究一番。

相同點:

1維護某個類在程式中只有唯一的例項,都可以通過getsingleton() , getsingletonptr()或instance()等方式來獲得唯一的例項。

2因為要用到不同的派生類中,一般把singleton提出來用template加以實現,這樣派生類直接繼承singleton,並例項化模板引數即可,如下:

template class

singleton

class _ogreexport logmanager : public singleton, public logalloc

其中的logalloc,這裡暫時不展開來談,等到分析ogre記憶體分配的時候,再詳細的說明。對於繼承於singleton的類的具體實現,我們要特化singleton的static成員變數,對於logmanager

template<> logmanager* singleton::mssingleton = 0;

不同點:

1.普通的singleton如(boostsingleton)建構函式為protected,程式呼叫instance的地方生成例項,在需要的地方直接呼叫instance或者getsingleton這類的函式即可:

//

singleton.hpp

template

/*static

*/ t &singleton::instance()

myclass::instance().dosomething();

而ogre的singleton有個特點在於它的建構函式是public的,初始化的而且是需要new的,如下:

mlogmanager =ogre_new logmanager();

mlogmanager->createlog(logfilename, true, true);

但在之後呼叫的時候就直接getsingleton就可以了。

我認為ogre這樣做的原因,是把最耗時間的初始化操作放在程式的開始,而等到真實渲染的時候,不必再為初始化instance而耗費時間,這個設計的缺點在於初始化的時間耗費比較多。

2.ogre使用單例比較特殊的地方,在於在每個單例裡面,他都會重寫,而重寫的函式只呼叫基類singleton的方法,如下:

static logmanager& getsingleton(void

);static logmanager* getsingletonptr(void);

這樣做的好處在於把模板的操作限定在單個類的實現中,而編譯器不需要程式設計時再跑到singleton的標頭檔案中,再對模板進行編譯。當你如果dll中匯出的單件時候,不是基於單個檔案的模板類就會出問題,會出現鏈結錯誤的情況,經本人確認的確如此,如果在具體的單件中重寫兩個方法就會把static的例項化限制在單個編譯單元中,而函式只需要呼叫基類的方法,這樣可以避免link error。

3.因為ogre跨平台和支援多編譯器的特性,在singleton的建構函式都會對編譯器的版本做一次判斷,如下:

singleton( void

)

比較難理解的地方在於#if defined( _msc_ver ) && _msc_ver < 1200 這行的預編譯判斷,<1200 意味著 vc的版本小於 vc6.0 (囧 那麼老的編譯器還有人用嗎) ,static的記憶體模型就會不同,需要做this指標做一次offset的調整,具體的記憶體模型目前上不太清楚,其實理解了感覺用處也不是特別大。

OGRE分析之設計模式

這段時間靜下心來看了一下ogre的源 有一點心得,於是寫下來形成如下的幾篇零散的文章 閱讀ogre分析之設計模式 四 摘要 iterator observer strategy template method ogre分析之設計模式 三 摘要 ogre分析之設計模式 chain of respons...

Java設計模式 單例模式(single)

目錄目的 應用例項 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。菜鳥教程 乙個國家有乙個首都 windows 是多程序多執行緒的,在操作乙個檔案的時候,就不可避免地出現多個程序或執行緒同時操作乙個檔案的現象,所以所有檔案的處理必須通過唯一的例項來進行。第一種 package com.ga...

OGRE中用到的設計模式

1.單例模式 singleton 2.工廠方法 factory method 3.介面卡模式 adapter 4.橋接模式 bridge 5.職責鏈模式 chain of responsibility 6.迭代器模式 iterator ogre vectoriterator t ogre mapit...