因?yàn)樵谠O(shè)計(jì)或開(kāi)發(fā)中,肯定會(huì)有這么一種情況,一個(gè)類(lèi)只能有一個(gè)對(duì)象被創(chuàng)建,如果有多個(gè)對(duì)象的話(huà),可能會(huì)導(dǎo)致?tīng)顟B(tài)的混亂和不一致。這種情況下,單例模式是最恰當(dāng)?shù)慕鉀Q辦法。它有很多種實(shí)現(xiàn)方式,各自的特性不相同,使用的情形也不相同。今天要實(shí)現(xiàn)的是常用的三種,分別是餓漢式、懶漢式和多線(xiàn)程式。
通過(guò)單例模式, 可以做到:
1. 確保一個(gè)類(lèi)只有一個(gè)實(shí)例被建立
2. 提供了一個(gè)對(duì)對(duì)象的全局訪(fǎng)問(wèn)指針
3. 在不影響單例類(lèi)的客戶(hù)端的情況下允許將來(lái)有多個(gè)實(shí)例
懶漢式的特點(diǎn)是延遲加載,比如配置文件,采用懶漢式的方法,顧名思義,懶漢么,很懶的,配置文件的實(shí)例直到用到的時(shí)候才會(huì)加載。。。。。。
class CSingleton { public: static CSingleton* GetInstance() { if ( m_pInstance == NULL ) m_pInstance = new CSingleton(); return m_pInstance; } private: CSingleton(){}; static CSingleton * m_pInstance; };
代碼很簡(jiǎn)單,但是會(huì)存在內(nèi)存泄漏的問(wèn)題,new出來(lái)的東西始終沒(méi)有釋放,下面是一種餓漢式的一種改進(jìn)。
class CSingleton { private: CSingleton() { } static CSingleton *m_pInstance; class CGarbo { public: ~CGarbo() { if(CSingleton::m_pInstance) delete CSingleton::m_pInstance; } }; static CGarbo Garbo; public: static CSingleton * GetInstance() { if(m_pInstance == NULL) m_pInstance = new CSingleton(); return m_pInstance; } };
餓漢式的特點(diǎn)是一開(kāi)始就加載了,如果說(shuō)懶漢式是“時(shí)間換空間”,那么餓漢式就是“空間換時(shí)間”,因?yàn)橐婚_(kāi)始就創(chuàng)建了實(shí)例,所以每次用到的之后直接返回就好了。
class CSingleton { private: CSingleton() { } public: static CSingleton * GetInstance() { static CSingleton instance; return &instance; } };
注:線(xiàn)程安全的通俗解釋 - 不管多個(gè)線(xiàn)程是怎樣的執(zhí)行順序和優(yōu)先級(jí),或是wait,sleep,join等控制方式,如果一個(gè)類(lèi)在多線(xiàn)程訪(fǎng)問(wèn)下運(yùn)轉(zhuǎn)一切正常,并且訪(fǎng)問(wèn)類(lèi)不需要進(jìn)行額外的同步處理或者協(xié)調(diào),那么我們就認(rèn)為它是線(xiàn)程安全的。 線(xiàn)程安全的類(lèi)應(yīng)當(dāng)封裝了所有必要的同步操作,調(diào)用者無(wú)需額外的同步。還有一點(diǎn):無(wú)狀態(tài)的類(lèi)永遠(yuǎn)是線(xiàn)程安全的。
在餓漢式的單例類(lèi)中,其實(shí)有兩個(gè)狀態(tài),單例未初始化和單例已經(jīng)初始化。假設(shè)單例還未初始化,有兩個(gè)線(xiàn)程同時(shí)調(diào)用GetInstance方法,這時(shí)執(zhí)行 m_pInstance == NULL 肯定為真,然后兩個(gè)線(xiàn)程都初始化一個(gè)單例,最后得到的指針并不是指向同一個(gè)地方,不滿(mǎn)足單例類(lèi)的定義了,所以餓漢式的寫(xiě)法會(huì)出現(xiàn)線(xiàn)程安全的問(wèn)題!在多線(xiàn)程環(huán)境下,要對(duì)其進(jìn)行修改。
這里要處理的是懶漢模式。
class Singleton { private: static Singleton* m_instance; Singleton(){} public: static Singleton* getInstance(); }; Singleton* Singleton::getInstance() { if(NULL == m_instance) { Lock();//借用其它類(lèi)來(lái)實(shí)現(xiàn),如boost if(NULL == m_instance) { m_instance = new Singleton; } UnLock(); } return m_instance; }
C++中的單例模式
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線(xiàn),公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿(mǎn)足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。
網(wǎng)站欄目:三種單例模式的C++實(shí)現(xiàn)-創(chuàng)新互聯(lián)
網(wǎng)頁(yè)URL:http://www.rwnh.cn/article4/cojgie.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、面包屑導(dǎo)航、網(wǎng)站改版、外貿(mào)建站、網(wǎng)站制作、虛擬主機(jī)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容
網(wǎng)頁(yè)設(shè)計(jì)公司知識(shí)