1、什么是單例模式
成都創(chuàng)新互聯(lián)是一家專注于網(wǎng)站設計制作、網(wǎng)站設計與策劃設計,德江網(wǎng)站建設哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設十多年,網(wǎng)設計領(lǐng)域的專業(yè)建站公司;建站業(yè)務涵蓋:德江等地區(qū)。德江做網(wǎng)站價格咨詢:18980820575
在架構(gòu)設計時,某些類在整個系統(tǒng)生命周期中最多只能有一個對象存在 ( Single Instance )。如超市收銀系統(tǒng),其外觀主要由顯示器(1個)、掃描槍(1個)、收款箱(1個)組成,在系統(tǒng)正常運行期間這三部分都是唯一存在的;也就是說,顯示器、掃描槍、收款箱這三部分都應該有各自的類,并且每個類只能唯一地實例化一個對象,基于這種模式的程序設計,稱為單例模式。
!?。卫J街荒軇?chuàng)建一個對象,且該對象的生命周期伴隨系統(tǒng)的整個運行期間。
2、怎么實現(xiàn)單例模式
思考:如何定義一個類,使得這個類最多只能創(chuàng)建一個對象?
分析:因為對象是由構(gòu)造函數(shù)創(chuàng)建的,所以我們應該將問題鎖定在構(gòu)造函數(shù)上;又因為只能創(chuàng)建一個對象,這就意味著只能調(diào)用一次構(gòu)造函數(shù);顯然將構(gòu)造函數(shù)的訪問權(quán)限設置為 public 不合適,所以,構(gòu)造函數(shù)的訪問權(quán)限只能是 private。然后,定義一個私有的靜態(tài)成員 c_instance = NULL 和 公有的靜態(tài)成員函數(shù),通過 c_instance 來判斷是否創(chuàng)建對象。(這個為什么要使用 靜態(tài)成員呢?因為構(gòu)造函數(shù)是私有的,在類的外部無法創(chuàng)建對象,只能通過類名調(diào)用靜態(tài)成員,而靜態(tài)成員函數(shù)只能調(diào)用靜態(tài)成員變量)
上述分析過程可簡化為:
(1)將構(gòu)造函數(shù)的訪問屬性設置為 private;
(2)定義私有的靜態(tài)成員屬性 instance 并初始化為 NULL;
(3)當需要使用對象時,訪問 instance 的值;
1)空值:創(chuàng)建對象,并用 instance 標記;
2)非空值:返回 instance 標記的對象;
單例模式實現(xiàn)
#include <iostream> #include <string> using namespace std; class SObject { static SObject* c_instance; // 定義標識符指針; /* 不需用拷貝和賦值,在單例模式中,始終只有一個對象 */ SObject(const SObject&); SObject& operator= (const SObject&); SObject() // 私有的構(gòu)造函數(shù) { } public: static SObject* GetInstance(); // 創(chuàng)建對象的入口 void print() { cout << "this = " << this << endl; } }; SObject* SObject::c_instance = NULL; // 靜態(tài)成員類內(nèi)聲明,類外定義 SObject* SObject::GetInstance() // 單例模式的關(guān)鍵 { if( c_instance == NULL ) { c_instance = new SObject(); } return c_instance; } int main() { SObject* s = SObject::GetInstance(); SObject* s1 = SObject::GetInstance(); SObject* s2 = SObject::GetInstance(); s->print(); // this = 0x940a008 s1->print(); // this = 0x940a008 s2->print(); // this = 0x940a008 return 0; } // 注:單例模式中,對象的生命周期存在整個系統(tǒng)運行過程中,所以是絕對不釋放的;
· 其實,在上述的單例模式實現(xiàn)案列中,有一部分代碼(分析過程中第2、3步)與類本身沒有任何關(guān)系,既然是這樣,我們就把這部分單獨提取出來處理。
問題所在:需要使用單例模式時,必須在每個類中定義 靜態(tài)成員變量 c_instance 和 靜態(tài)成員函數(shù) GetInstance();當有多個類都需要使用單例模式時,這樣的實現(xiàn)方式明顯的很冗余,為了能夠代碼復用,我們可以 將這兩部分抽象成一個新類(做成類模板,聲明為其它類的友元類,這樣與之前的效果一樣)。
基于類模板的單例模式實現(xiàn)
// 對上個單例模式實現(xiàn)代碼的改進 // singleton.hpp 單例模式代碼 #ifndef SINGLETON_H #define SINGLETON_H template < typename T > class Singleton { static T* c_instance; public: static T* GetInstance(); }; template < typename T > T* Singleton<T>::c_instance = NULL; template < typename T > T* Singleton<T>::GetInstance() { if( c_instance == NULL ) { c_instance = new T(); } return c_instance; } #endif // main.cpp 測試文件 #include <iostream> #include <string> #include "singleton.hpp" using namespace std; class SObject { friend class Singleton<SObject>; // 當前類需要使用單例模式 SObject(const SObject&); SObject& operator= (const SObject&); SObject() { } public: void print() { cout << "this = " << this << endl; } }; int main() { SObject* s = Singleton<SObject>::GetInstance(); SObject* s1 = Singleton<SObject>::GetInstance(); SObject* s2 = Singleton<SObject>::GetInstance(); s->print(); // 0xe63c20 s1->print(); // 0xe63c20 s2->print(); // 0xe63c20 return 0; }
在今后工作中,如果一個類(SObject)要使用單例模式(Singleton 單例模式的類模板),只需三步驟:
(1)類(SObject)的構(gòu)造函數(shù)必須私有化;同時,拷貝構(gòu)造函數(shù)、重載=操作符 也私有化;
(2)將單例模式的類模板聲明為這個類的友元類; friend class Singleton<SObject>;
(3)通過 單例模式類模板中 SObject* s = Singleton<SObject>::GetInstance(); 創(chuàng)建對象。
到此這篇關(guān)于c++中的單例類模板的實現(xiàn)方法詳解的文章就介紹到這了,更多相關(guān)c++ 單例類模板內(nèi)容請搜索創(chuàng)新互聯(lián)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持創(chuàng)新互聯(lián)!
本文題目:c++中的單例類模板的實現(xiàn)方法詳解
本文鏈接:http://chinadenli.net/article16/ppghgg.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供響應式網(wǎng)站、網(wǎng)站改版、營銷型網(wǎng)站建設、品牌網(wǎng)站設計、虛擬主機、動態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)