(參考某位網友的,特此聲明。)
單例模式是一種常用的軟件設計模式。
核心結構:只包含一個被稱爲單例的特殊類;
目的:保證一個類只有一個實例,並提供一個訪問他的全局訪問點,該實例被所有程序模塊共享;
引用場景:有一些對象只需要一個,如:對話框,系統日誌,顯卡等設備的驅動程序對象、一個PC連接一個鍵盤等;
三種實現方式:懶漢式,餓漢式,雙重檢查鎖;
1.懶漢式:
構造函數聲明爲private或者protect防止被外部函數實例化,內部保存一個private static的類指針保存唯一的實例,實例的動作有一個public的類方法實現。
class singleton //實現單例模式的類
{
private:
singleton(){} //私有的構造函數
static singleton* Instance;
public:
static singleton* GetInstance()
{
if (Instance == NULL) //判斷是否第一調用
Instance = new singleton();
return Instance;
}
};
缺點:這個實現在單線程下是正確的,但在多線程情況下,如果兩個線程同時首次調用GetInstance方法且同時檢測到Instance是NULL,則兩個線程會同時構造一個實例給Instance,這樣就會發生錯誤。
- 改進的懶漢式(靜態內部變量)
在GetInstance函數裏定義一個靜態的實例,可以保證擁有唯一的實例,在返回是需要返回其指針即可。代碼如下:
class singleton //實現單例模式的類
{
private:
singleton() {} //私有的構造函數
public:
static singleton* GetInstance()
{
static singleton Instance;
return &Instance;
}
};
3.改進的懶漢式(雙重檢查鎖)
思路:只有在第一次創建的時候進行加鎖,當Instance不爲空的時候就不需要進行加鎖的操作。代碼如下:
class singleton //實現單例模式的類
{
private:
singleton(){} //私有的構造函數
static singleton* Instance;
public:
static singleton* GetInstance()
{
if (Instance == NULL) //判斷是否第一調用
{
Lock(); //表示上鎖的函數
if (Instance == NULL)
{
Instance = new singleton();
}
UnLock() //解鎖函數
}
return Instance;
}
};
4.餓漢式
餓漢式的特點是:一開始就創建了實例,所以每次用到的之後直接返回。代碼如下:
class singleton //實現單例模式的類
{
private:
singleton(){} //私有的構造函數
static singleton* Instance;
public:
static singleton* GetInstance()
{
return Instance;
}
};