生活随笔
收集整理的這篇文章主要介紹了
设计模式C++实现(2)——单例模式
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
軟件領(lǐng)域中的設(shè)計模式為開發(fā)人員提供了一種使用專家設(shè)計經(jīng)驗的有效途徑。設(shè)計模式中運用了面向?qū)ο缶幊陶Z言的重要特性:封裝、繼承、多態(tài),真正領(lǐng)悟設(shè)計模式的精髓是可能一個漫長的過程,需要大量實踐經(jīng)驗的積累。最近看設(shè)計模式的書,對于每個模式,用C++寫了個小例子,加深一下理解。主要參考《大話設(shè)計模式》和《設(shè)計模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)》(DP)兩本書。本文介紹單例模式的實現(xiàn)。
?? ? ?單例的一般實現(xiàn)比較簡單,下面是代碼和UML圖。由于構(gòu)造函數(shù)是私有的,因此無法通過構(gòu)造函數(shù)實例化,唯一的方法就是通過調(diào)用靜態(tài)函數(shù)GetInstance。
?? ? ?UML圖:
?? ? ?代碼:
[cpp]?view plaincopyprint?
?? class?Singleton???? {?? public:?? ????static?Singleton*?GetInstance();?? private:?? ????Singleton()?{}?? ????static?Singleton?*singleton;?? };?? ?? Singleton*?Singleton::singleton?=?NULL;?? Singleton*?Singleton::GetInstance()?? {?? ????if(singleton?==?NULL)?? ????????singleton?=?new?Singleton();?? ????return?singleton;?? }??
?? ? ? 這里只有一個類,如何實現(xiàn)Singleton類的子類呢?也就說Singleton有很多子類,在一種應(yīng)用中,只選擇其中的一個。最容易就是在GetInstance函數(shù)中做判斷,比如可以傳遞一個字符串,根據(jù)字符串的內(nèi)容創(chuàng)建相應(yīng)的子類實例。這也是DP書上的一種解法,書上給的代碼不全。這里重新實現(xiàn)了一下,發(fā)現(xiàn)不是想象中的那么簡單,最后實現(xiàn)的版本看上去很怪異。在VS2008下測試通過。
[cpp]?view plaincopyprint?
?? #pragma?once?? #include?<iostream>?? using?namespace?std;?? ?? class?Singleton???? {?? public:?? ????static?Singleton*?GetInstance(const?char*?name);?? ????virtual?void?Show()?{}?? protected:??? ????Singleton()?{}?? private:?? ????static?Singleton?*singleton;??? };?? ?? ?? #include?"Singleton.h"?? #include?"SingletonA.h"?? #include?"SingletonB.h"?? Singleton*?Singleton::singleton?=?NULL;?? Singleton*?Singleton::GetInstance(const?char*?name)?? {?? ????if(singleton?==?NULL)?? ????{?? ????????if(strcmp(name,?"SingletonA")?==?0)?? ????????????singleton?=?new?SingletonA();?? ????????else?if(strcmp(name,"SingletonB")?==?0)?? ????????????singleton?=?new?SingletonB();?? ????????else??? ????????????singleton?=?new?Singleton();?? ????}?? ????return?singleton;?? }??
[cpp]?view plaincopyprint?
?? #pragma?once?? #include?"Singleton.h"?? class?SingletonA:?public?Singleton?? {?? ????friend?class?Singleton;??? public:?? ????void?Show()?{?cout<<"SingletonA"<<endl;?}?? private:????? ????SingletonA()?{}??? };?? ?? #pragma?once?? #include?"Singleton.h"?? class?SingletonB:?public?Singleton?? {?? ????friend?class?Singleton;??? public:?? ????void?Show(){?cout<<"SingletonB"<<endl;?}?? private:???? ????SingletonB()?{}?? };??
[cpp]?view plaincopyprint?
#include?"Singleton.h"?? int?main()?? {?? ????Singleton?*st?=?Singleton::GetInstance("SingletonA");?? ????st->Show();?? ????return?0;?? }??
?? ? ? 上面代碼有一個地方很詭異,父類為子類的友元,如果不是友元,函數(shù)GetInstance會報錯,意思就是無法調(diào)用SingletonA和SIngletonB的構(gòu)造函數(shù)。父類中調(diào)用子類的構(gòu)造函數(shù),我還是第一次碰到。當然了把SingletonA和SIngletonB的屬性設(shè)為public,GetInstance函數(shù)就不會報錯了,但是這樣外界就可以定義這些類的對象,違反了單例模式。
? ? ? ?看似奇怪,其實也容易解釋。在父類中構(gòu)建子類的對象,相當于是外界調(diào)用子類的構(gòu)造函數(shù),因此當子類構(gòu)造函數(shù)的屬性為私有或保護時,父類無法訪問。為共有時,外界就可以訪問子類的構(gòu)造函數(shù)了,此時父類當然也能訪問了。只不過為了保證單例模式,所以子類的構(gòu)造函數(shù)不能為共有,但是又希望在父類中構(gòu)造子類的對象,即需要調(diào)用子類的構(gòu)造函數(shù),這里沒有辦法才出此下策:將父類聲明為子類的友元類。
? ? ? 本人享有博客文章的版權(quán),轉(zhuǎn)載請標明出處 http://blog.csdn.net/wuzhekai1985
總結(jié)
以上是生活随笔為你收集整理的设计模式C++实现(2)——单例模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。