最后,BTW,《Modern C++ Design》确实是一本好书,在这里也顺便推荐一下^_^
Loki的下载地址是http://sourceforge.net/projects/loki-lib/,目前最新版本是Loki 0.1.7,后面的代码都使用这个版本作为测试标准。
编译
Loki库提供了N多种编译途经,你可以直接打开项目文件(VC、Code::Block、Cpp-Dev等IDE)编译,也可以用传统的makefile来make,还可以直接用批处理文件编译。象我这种被IDE惯坏的人,一般都是直接把src目录里的代码加入到项目中了事。
Singleton模式(单件模式)
Singleton模式确保一个类在系统中只有一个实例。比如一个窗口系统中只能有一个鼠标对象,只有一个屏幕对象,一个剪切板对象...。我们可以用一个全局变量来做这些工作,但它不能防止实例化多个对象。一个更好的办法是让类自身保存它的唯一实例,并且不允许创建其它实例,这就是Singleton模式。
Loki库的SingletonHolder类提供了对Singleton模式的支持
头文件
- #include <loki/Singleton.h>
类型定义
- template<
- typename T,
- template< class > class CreationPolicy = CreateUsingNew,
- template< class > class LifetimePolicy = DefaultLifetime,
- template< class, class > class ThreadingModel = ::Loki::SingleThreaded,
- class MutexPolicy = ::Loki::Mutex>
- class Loki::SingletonHolder;
Loki的类大部分都是基于策略编程的,其中最主要的是CreationPolicy,它决定了怎样生成一个类实例,可选的有:
- template<template<class> class Alloc> struct CreateUsing; 在分配器分配的内存中生成实例,如
- template <class T> struct CreateStatic 生成静态实例
- template <class T> struct CreateUsingMalloc 使用malloc申请内存并在其中生成实例
- template <class T> struct CreateUsingNew 使用new生成实例(默认)
示例代码
- class MyClass{
- public:
-
- MyClass(){;}
-
- void ShowPtr()
- {
- std::cout << this << std::endl;
- }
- };
- typedef Loki::SingletonHolder<MyClass> MyClassSingleton;
-
- int _tmain(int argc, _TCHAR* argv[])
- {
-
- MyClass& v = MyClassSingleton::Instance();
- v.ShowPtr();
-
- MyClassSingleton::Instance().ShowPtr();
- return 0;
- }
Loki::SingletonHolder默认的CreationPolicy策略要求类必须有默认构造,如MyClass这样。如果需要包装没有默认构造的类的话,我们就得自定义一个CreationPolicy策略,好在CreationPolicy策略比较简单,先看看Loki中默认的CreateUsingNew吧:
- template <class T> struct CreateUsingNew
- {
- static T* Create()
- { return new T; }
-
- static void Destroy(T* p)
- { delete p; }
- };
呵呵,简单吧,只是简单的Create和Destroy而已。
我们只要修改Create()静态方法,new一个自己的对象就可以了,当然随便多少构造参数都可以在这里写上去啦。另外,如有必要,也可以做一些其它初始工作哦。
- class MyClass2{
- public:
-
- MyClass2(int,int){;}
- void ShowPtr()
- {
- std::cout << this << std::endl;
- }
- };
- template<class T>
- class CreateMyClass2UsingNew:
- public Loki::CreateUsingNew<T>
- {
- public:
- static T* Create()
- { return new T(0,0); }
- };
- typedef Loki::SingletonHolder<MyClass2,
- CreateMyClass2UsingNew> MyClass2Singleton;
- int _tmain(int argc, _TCHAR* argv[])
- {
- MyClass2Singleton::Instance().ShowPtr();
- MyClass2Singleton::Instance().ShowPtr();
- return 0;
- }