單例模式
單例模式是一種常用的軟件設計模式。在它的核心結構中只包含一個被稱爲單例類的特殊類。通過單例模式可以保證系統中一個類只有一個實例而且該實例易於外界訪問,從而方便對實例個數的控制並節約系統資源。如果希望在系統中某個類的對象只能存在一個,單例模式是最好的解決方案。
對於系統中的某些類來說,只有一個實例很重要,例如,一個系統中可以存在多個打印任務,但是隻能有一個正在工作的任務;一個系統只能有一個窗口管理器或文件系統;一個系統只能有一個計時工具或ID(序號)生成器。如在Windows中就只能打開一個任務管理器。如果不使用機制對窗口對象進行唯一化,將彈出多個窗口,如果這些窗口顯示的內容完全一致,則是重複對象,浪費內存資源;如果這些窗口顯示的內容不一致,則意味着在某一瞬間系統有多個狀態,與實際不符,也會給用戶帶來誤解,不知道哪一個纔是真實的狀態。因此有時確保系統中某個對象的唯一性即一個類只能有一個實例非常重要。
如何保證一個類只有一個實例並且這個實例易於被訪問呢?定義一個全局變量可以確保對象隨時都可以被訪問,但不能防止我們實例化多個對象。一個更好的解決辦法是讓類自身負責保存它的唯一實例。這個類可以保證沒有其他實例被創建,並且它可以提供一個訪問該實例的方法。這就是單例模式的模式動機。(摘自 劉偉主編 .設計模式 .北京市 :清華大學出版社 ,2011 :134-135 .)
單例模式的特點有3個:
1、單例類只能有一個實例。
2、單例類必須自己創建自己的唯一實例。
3、單例類必須給所有其他對象提供這一實例。
Singleton 模式包含的角色只有一個,就是Singleton 。Singleton 擁有一個私有構造函數,確保用戶無法用過 new 直接實例化它。除此之外,該模式中包含一個靜態私有成員變量 instance 與靜態公有方法 Instance()。Instance 方法負責檢驗並實例化自己,然後存儲在靜態成員變量中,以確保只有一個實例被創建。
測試代碼如下:
/* C++單例模式 */
#include<iostream>
using namespace std;
class Singleton
{
private:
Singleton() //構造函數是私有的
{
cout<<"Creat Singleton."<<endl;
}
static Singleton* m_instance;
public:
static Singleton* GetInstance()
{
if(m_instance == NULL) //判斷是否爲第一次調用
m_instance = new Singleton();
return m_instance;
}
};
Singleton* Singleton::m_instance = NULL;
int main()
{
Singleton* p1 = Singleton::GetInstance();
Singleton* p2 = p1->GetInstance();
Singleton* p3 = Singleton::GetInstance();
Singleton &ref = *Singleton::GetInstance();
cout<<p1<<endl;
cout<<p2<<endl;
cout<<p3<<endl;
cout<<&ref<<endl;
}
測試結果如下圖:
從測試結果圖中可以看到,main 函數創建了4次 Singleton 類實例,但真正只在第一次調用了構造函數,且4次創建均返回相同的指針,這說明 GetInstance() 使用懶惰初始化,也就是說它的返回值是當這個函數首次被訪問時被創建的。