吼一句先:有需要才用模式,不为模式而模式,K.I.S.S
今天忙里偷闲捡起放下了的mangos,看一下mangos的代码,发现了常用的两个模式的应用,一个为Singleton,另一个为Factory。
Singleton配合模版,将单一模式发挥到极致,如下:
template
<
typename T, //这个将类型传入
class ThreadingModel = MaNGOS::SingleThreaded<T>,
class CreatePolicy = MaNGOS::OperatorNew<T>,
class LifeTimePolicy = MaNGOS::ObjectLifeTime<T>
>
class MANGOS_DLL_DECL Singleton // MANGOS_DLL_DECL 是typedef __declspec(dllexport)
通过模版类将要遵循单一原则的类传入Singleton中。剥离类和实现。从而单一模式可以到处使用。比如
#define sWorld MaNGOS::Singleton<World>::Instance() //保证只有一个游戏世界
#define sLog MaNGOS::Singleton<Log>::Instance() //只有一个日志记录实例
而Factory 用的是一个注册方法
template<class T, class Key = std::string>
class MANGOS_DLL_DECL FactoryHolder
{
public:
typedef ObjectRegistry<FactoryHolder<T, Key >, Key > FactoryHolderRegistry;
typedef MaNGOS::Singleton<FactoryHolderRegistry > FactoryHolderRepository;
.........
将类型T,和关键字传入注册类实例ObjectRegistry,并定义了注册自己和解注册的函数
void RegisterSelf(void) { FactoryHolderRepository::Instance().InsertItem(this, i_key); }
void DeregisterSelf(void) { FactoryHolderRepository::Instance().RemoveItem(this, false); }
从而实现可以根据Key的类型,一般是字典方法,即用String代表不同的类实例,建立映射表,将对象注册进工厂中。