Singleton單例模式
Singleton 是對全局變量的取代策略
作用:保證一個類只能有一個實例,並提供一個全局唯一的訪問點。
僅有一個實例:通過類的靜態成員變量來體現。
提供訪問它的全局訪問點:訪問靜態成員變量的靜態成員函數來體現。
《設計模式》一書中給出了一種很不錯的實現,定義一個單例類,使用類的私有靜態指針變量指向類的唯一實例,並用一個公有的靜態方法獲取該實例。
單例模式通過類本身來管理其唯一實例,這種特性提供了解決問題的方法。唯一的實例是類的一個普通對象,但設計這個類時,讓它只能創建一個實例並提供對此實例的全局訪問。唯一實例類Singleton在靜態成員函數中隱藏創建實例的操作。習慣上把這個成員函數叫做Instance(),它的返回值是唯一實例的指針。
單例類Singleton有以下特征:
它有一個指向唯一實例的靜態指針,並且是私有的;
它有一個公有的函數,可以獲取這個唯一的實例,並且在需要的時候創建該實例;
它的構造函數是私有的,這樣就不能從別處創建該類的實例。
UML圖:
在Singleton模式的結構圖中可以看到,我們通過維護一個static的成員變量_instance來記錄這個唯一的對象實例。通過提供一個staitc的接口Instance來獲得這個唯一的實例。
代碼如下:
Singleton.h
1 #ifndef _SINGLETON_H_ 2 #define _SINGLETON_H_ 3 4 class Singleton 5 { 6 private: 7 static Singleton* pInstance;//靜態成員,保存對象的唯一實例 8 Singleton();//私有化構造函數,使其無法在類外實例化 9 public: 10 static Singleton* Instance(); 11 //void Destroy(); 12 static void Destroy(); 13 }; 14 15 #endif
Singleton.cpp
1 #include "Singleton.h" 2 #include <iostream> 3 4 using namespace std; 5 6 Singleton* Singleton::pInstance = NULL; 7 8 Singleton::Singleton() 9 { 10 cout<< "Singleton..." << endl; 11 } 12 13 Singleton* Singleton::Instance() 14 { 15 if(NULL == pInstance) 16 { 17 pInstance = new Singleton(); 18 } 19 return pInstance; 20 } 21 22 void Singleton::Destroy() 23 { 24 delete pInstance; 25 pInstance = NULL; 26 cout<< "Destroy..." << endl; 27 }
main.cpp
1 #include "Singleton.h" 2 #include <iostream> 3 4 using namespace std; 5 6 int main() 7 { 8 Singleton* ps = Singleton::Instance();//通過全局訪問點獲取實例 9 Singleton::Destroy(); 10 return 0; 11 }
Singleton不可以被實例化,因此我們將其構造函數聲明為protected或者直接聲明為private。