1. 程式人生 > >C++單例的建立與使用

C++單例的建立與使用

在C++中我們經常會碰到一種情況,就是某一個類的物件只需要一個物件的例項化,例如在某些驅動裝置的開發,對某個檔案或者套接子的處理,要求在整個程式中有且僅有一個物件,那就需要單例來解決這一問題。
< 專業解釋
單例模式也稱為單件模式、單子模式,可能是使用最廣泛的設計模式。其意圖是保證一個類僅有一個例項,並提供一個訪問它的全域性訪問點,該例項被所有程式模組共享。有很多地方需要這樣的功能模組,如系統的日誌輸出,GUI應用必須是單滑鼠,MODEM的聯接需要一條且只需要一條電話線,作業系統只能有一個視窗管理器,一臺PC連一個鍵盤。
單例模式有許多種實現方法,在C++中,甚至可以直接用一個全域性變數做到這一點,但這樣的程式碼顯的很不優雅。 使用全域性物件能夠保證方便地訪問例項,但是不能保證只宣告一個物件——也就是說除了一個全域性例項外,仍然能建立相同類的本地例項。
《設計模式》一書中給出了一種很不錯的實現,定義一個單例類,使用類的私有靜態指標變數指向類的唯一例項,並用一個公有的靜態方法獲取該例項。
單例模式通過類本身來管理其唯一例項,這種特性提供瞭解決問題的方法。唯一的例項是類的一個普通物件,但設計這個類時,讓它只能建立一個例項並提供對此例項的全域性訪問。唯一例項類Singleton在靜態成員函式中隱藏建立例項的操作。習慣上把這個成員函式叫做Instance(),它的返回值是唯一例項的指標。
>
下面就來說說如何在C++中建立單例。

1、建立單例

class CSingleton
{
private:
    CSingleton()   //建構函式是私有的
    {
    }
    static CSingleton *m_pInstance;
public:
    static CSingleton * GetInstance()
    {
        if(m_pInstance == NULL)  //判斷是否第一次呼叫
            m_pInstance = new CSingleton();
        return m_pInstance;
    }
};

建立單例的方法:
1、遮蔽建構函式,外界就不可以通過類的建構函式創造類的例項化;
2、建立物件的靜態指標,並且提供靜態方法供外界訪問;
這樣一個簡單的單例就建立成功。
使用者訪問唯一例項的方法只有GetInstance()成員函式。如果不通過這個函式,任何建立例項的嘗試都將失敗,因為類的建構函式是私有的。GetInstance()使用懶惰初始化,也就是說它的返回值是當這個函式首次被訪問時被建立的。這是一種防彈設計——所有GetInstance()之後的呼叫都返回相同例項的指標:

CSingleton* p1 = CSingleton :: GetInstance();
CSingleton* p2 = p1->GetInstance();
CSingleton & ref = * CSingleton :: GetInstance();