c 中的單例類模板的實現方法詳解

2022-10-03 15:27:11 字數 2213 閱讀 9815

1、什麼是單例模式

在架構設計時,某些類在整個系統生命週期中最多只能有乙個物件存在 ( single instance )。如超市收銀系統,其外觀主要由顯示器(1個)、掃瞄槍(1個)、收款箱(1個)組成,在系統正常執行期間這三部分都是唯一存在的;也就是說,顯示器、掃瞄槍、收款箱這三部分都應該有各自的類,並且每個類只能唯一地例項化乙個物件,基於這種模式的程式設計,稱為單例模式。

!!!單例模式只能建立乙個物件,且該物件的生命週期伴隨系統的整個執行期間。

2、怎麼實現單例模式

思考:如何定義乙個類,使得這個類最多只能建立乙個物件?

分析:因為物件是由建構函式建立的,所以我們應該將問題鎖定在建構函式上;又因為只能建立乙個物件,這就意味著只能呼叫一次建構函式;顯然將建構函式的訪問許可權設定為 public 不合適,所以,建構函式的訪問許可權只能是 private。然後,定義乙個私有的靜態成員 c_instance = null 和 公有的靜態成員函式,通過  c_instance 來判斷是否建立物件。(這個為什麼要使用 靜態成員呢?因為建構函式是私有的,在類的外部無法建立物件,只能通過類名呼叫靜態成員,而靜態成員函式只能呼叫靜態成員變數)

上述分析過程可簡化為:

(1)將建構函式的訪問屬性設定為 private;

(2)定義私有的靜態成員屬性 instance 並初始化為 null;

(3)當需要使用物件時,訪問 instance 的值;

1)空值:建立物件,並用 instance 標記;

2)非空值:返回 instance 標記的物件;

單例模式實現

#include

#include

using namespace std;

class sobject

public:

static sobject* getinstance(); // 建立物件www.cppcns.com的入口

void print()

};sobject* sobject::c_instance = null; // 靜態成員類內宣告,類外定義

sobject* sobject::getinstance() // 單例模式的關鍵

return c_instance;

}int main()

// 注:單例模式中,物件的生命週期存在整個系統執行過程中,所以是絕對不釋放的;

其實,在上述的單例模式實現案列中,有一部分**(分析過程中第2、3步)與類本身沒有任何關係,既然是這樣,我們就把這部分單獨提取出來處理。

問題所在:需要使用單例模式時,必須在每個類中定義 靜態成員變數 c_instance 和 靜態成員函式 getinstance();當有多個類都需要使用單例模式時,這樣的實現方式明顯的很冗餘,為了能夠**復用,我們可以 將這兩部分抽象成乙個新類(做成類模板,宣告為其它類的友元類,這樣與之前的效果一樣)。

基於類模板的單例模式實現

// 對上個單例模式實現**的改進

// singleton.hpp 單例模式**

#ifndef singleton_h

#define singleton_h

template

< typename t >

class singleton

;template

< typename t >

t* singleton::c_instance = null;

template

< typename t >

t* singleton::getinstance()

return c_instance;

}#endif

// main.cpp 測試檔案

#include

#include

#include "singleton.hpp"

using namespace std;

class sobject

public:

void print()

};int main()

在今後工作中,如果乙個類(sobject)要使用單例模式(singleton 單例模式的類模板),只需三步驟:

(1)類(sobject)的建構函式必須私有化;同時,拷貝建構函式、過載=操作符 也私有化;

(2)將單例模式的類模板宣告為這個類的友元類; friend class singleton;

(3)通過 單例模式類模板中 sobject* s = singleton::getinstance(); 建立物件。

C 單例類模板詳解

單例類 描述指在整個系統生命期中,乙個類最多只能有乙個例項 instance 存在,使得該例項的唯一性 例項是指乙個物件指標 比如 統計 人數 在單例類裡,又分為了懶漢式和餓漢式,它們的區別在於建立例項的時間不同 用法 初探單例類 懶漢式 include using namespace std cl...

28 C 單例類模板 詳解

單例類 描述 指在整個系統生命期中,乙個類最多只能有乙個例項 instance 存在,使得該例項的唯一性 例項是指乙個物件指標 在單例類裡,又分為了懶漢式和餓漢式,它們的區別在於建立例項的時間不同 用法 初探單例類 懶漢式 include using namespace std class csin...

C 單例模板類

單例模式 singleton 是設計模式常見的一種,其目的是保證 系統中只存在某 類的唯一例項 物件 在 應用程式中,經常用於配置,日誌等的處理。使用單例模板類可以很容易地實現單例模式。如下 templateclass csingleton return m pinstance protected ...