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 ...