最后,BTW,《Modern C++ Design》确实是一本好书,在这里也顺便推荐一下^_^
Loki的下载地址是,目前最新版本是Loki 0.1.7,后面的代码都使用这个版本作为测试标准。
编译
Loki库提供了N多种编译途经,你可以直接打开项目文件(VC、Code::Block、
Cpp-Dev等IDE)编译,也可以用传统的makefile来make,还可以直接用批处理文件编译。象我这种被IDE惯坏的人,一般都是直接把
src目录里的代码加入到项目中了事。
Singleton模式(单件模式)
Singleton模式确保一个类在系统中只有一个实例。比如一个窗口系统中只能有一个鼠标
对象,只有一个屏幕对象,一个剪切板对象...。我们可以用一个全局变量来做这些工作,但它不能防止实例化多个对象。一个更好的办法是让类自身保存它的唯
一实例,并且不允许创建其它实例,这就是Singleton模式。
Loki库的SingletonHolder类提供了对Singleton模式的支持
头文件
类型定义
-
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 class Alloc> struct CreateUsing; 在分配器分配的内存中生成实例,如
-
template struct CreateStatic 生成静态实例
-
template struct CreateUsingMalloc 使用malloc申请内存并在其中生成实例
-
template struct CreateUsingNew 使用new生成实例(默认)
示例代码
-
class MyClass{
-
public:
-
-
MyClass(){;}
-
-
void ShowPtr()
-
{
-
std::cout << this << std::endl;
-
}
-
};
-
-
typedef Loki::SingletonHolder 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
-
{
-
public:
-
static T* Create()
-
{ return new T(0,0); }
-
};
-
-
typedef Loki::SingletonHolder
-
CreateMyClass2UsingNew> MyClass2Singleton;
-
-
int _tmain(int argc, _TCHAR* argv[])
-
{
-
MyClass2Singleton::Instance().ShowPtr();
-
MyClass2Singleton::Instance().ShowPtr();
-
return 0;
-
}
-