工廠模式有很多變種,我使用boost::bind和boost::function實現了一個我自己的版本.這個實現方式與其他方式相比,好處在於編碼簡單,實現方便.添加新的類創建功能的支持是在程序運行中實現的.對以前寫的代碼根本不需要任何的更改.
思路:在工廠中保存一個字符串與函數指針pair的列表.函數指針指向類的創建函數.當要創建新的類的實例的時候,查找這個列表,並返回結果.
這個辦法的實現如下:
首先定義函數指針的形式:
typedef boost::function<void(ConstructInfo&,void**)> Creator;
ConstructInfo包括了創建類需要的參數,void** 是一個指針的指針,用來把創建好的類的指針傳送出來.
其次工廠中要添加一個map:
std::map<Ogre::String,Creator> FactoryMap;
string用來標識需要創建哪個類.
爲了讓工廠能動態增加創建的類的實例的功能,添加一個註冊函數:
使用上面的註冊函數註冊之後如何創建呢?使用下面的函數:
現在回頭看看,如何把類創建函數的指針保存到map的Creator中呢?
首先,在類的實現中添加一個靜態的創建函數:
當然也可以不是類的靜態函數,藉助bind的強大功能,可以實現各種各樣的綁定.但個人覺得把這個函數寫入到類的靜態函數中在代碼組織上比較好一點.
然後在程序中運行下面的代碼即可:
這個看上去似乎不是很簡明..不過沒關係,我們來個宏:
#define RegisteFactory(Type,typeName) Factory::getSingleton().registerCreator(typeName,boost::bind(Type::Create,_1,_2))
這樣程序運行只需要調用
RegisteFactory(CustomClass,"CustomClass");就可以了
最後唯一的問題...什麼時候纔是調用這個宏的時機呢..答案是什麼時候都可以..只要你在創建第一個實例之前調用它....