不得不说说Loki这个库还是相当厉害的,采用模板的方式实现了很多的设计模式,例如单体模式、策略模式、访问者模式、工厂模式等。下面从Loki库入门的设计模式介绍一下,
Loki的单体模板类设计的非常强大,通过策略模式将单体的各个组件给模块化了,非常厉害,如下:
template
<
typename T,
template <class> class CreationPolicy = CreateUsingNew,
template <class> class LifetimePolicy = DefaultLifetime,
template <class, class> class ThreadingModel = LOKI_DEFAULT_THREADING_NO_OBJ_LEVEL,
class MutexPolicy = LOKI_DEFAULT_MUTEX
>
class SingletonHolder
SingletonHolder的模板参数主要是创建策略、生命周期策略和线程模型。
1.创建策略默认使用new操作符来创建对象,当然也可以使用C语言的内存分配来创建CreateUsingMalloc或则CreateStatic,也可以从这些模板创建方法中派生出自己的创建策略,但是一定要实现里面的函数接口,例如有一个参数的构造类,可以像如下这样来编写自己的创建类
class CreateUsingOneNew : public CreateUsingNew
{
public:
static T* Create()
{ return new T(xxx); }
static void Destroy(T* p)
{ delete p; }
}
必须要实现的是Create、和Destory函数。
2.生命周期,由于单体是在程序的运行期会一直存在,那么其生命周期默认是程序结束之后析构对象,其默认的就是如此DefaultLifetime,针对某些特殊的情况,多个单体对象,但是在析构的时候需要区分优先级,这时可以使用PhoenixSingleton规则来决定其对象释放的先后顺序。
3.线程模式,主要针对咱们的应用程序的类型,如果应用程序使用了多线程则需要线程安全模式,否则以单线程来执行即可。
4.其他的单体实现方式,也可以通过继承的结构来实现,模板类传入子类的名称即可,见如下简写代码
template<class T>
class BaseSingleton
{
public:
T instance()
{
static T instance();
return instance;
}
private:
BaseSingleton& operator=(const BaseSingleton&);
BaseSingleton(const BaseSingleton&);
}
class DerivedSingleton : public BaseSingleton<DerivedSingleton>
{}