最後,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模式。ide
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吧:ui
- template <class T> struct CreateUsingNew
- {
- static T* Create()
- { return new T; }
-
- static void Destroy(T* p)
- { delete p; }
- };
呵呵,簡單吧,只是簡單的Create和Destroy而已。this
咱們只要修改Create()靜態方法,new一個本身的對象就能夠了,固然隨便多少構造參數均可以在這裏寫上去啦。另外,若有必要,也能夠作一些其它初始工做哦。spa
- 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;
- }