設計模式之單例模式

(參考某位網友的,特此聲明。)
單例模式是一種常用的軟件設計模式。
核心結構:只包含一個被稱爲單例的特殊類;
目的:保證一個類只有一個實例,並提供一個訪問他的全局訪問點,該實例被所有程序模塊共享;
引用場景:有一些對象只需要一個,如:對話框,系統日誌,顯卡等設備的驅動程序對象、一個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,這樣就會發生錯誤。

  1. 改進的懶漢式(靜態內部變量)
    在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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章