C++設(shè)計(jì)模式

https://www.cnblogs.com/chengjundu/p/8473564.html

單例模式

保證一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)訪問它的全局訪問點(diǎn)涛癌。
主要解決:一個(gè)全局使用的類頻繁地創(chuàng)建與銷毀。
何時(shí)使用:想控制實(shí)例數(shù)目,節(jié)省系統(tǒng)資源的時(shí)候。
如何解決:判斷系統(tǒng)是否已存在單例费什,如果有則返回,沒有則創(chuàng)建手素。
關(guān)鍵代碼:構(gòu)造函數(shù)是私有的鸳址。

單例的實(shí)現(xiàn)主要有兩種:懶漢式和餓漢式
懶漢:故名思義,不到萬不得已就不會去實(shí)例化類泉懦,也就是說在第一次用到類實(shí)例的時(shí)候才會去實(shí)例化氯质,所以上邊的經(jīng)典方法被歸為懶漢實(shí)現(xiàn);
餓漢:餓了肯定要饑不擇食祠斧。所以在單例類定義的時(shí)候就進(jìn)行實(shí)例化。
特點(diǎn)與選擇:
由于要進(jìn)行線程同步拱礁,所以在訪問量比較大琢锋,或者可能訪問的線程比較多時(shí),采用餓漢實(shí)現(xiàn)呢灶,可以實(shí)現(xiàn)更好的性能吴超。這是以空間換時(shí)間。
在訪問量較小時(shí)鸯乃,采用懶漢實(shí)現(xiàn)鲸阻。這是以時(shí)間換空間跋涣。

餓漢式:線程安全,注意delete
class Singleton
{
public:
    static Singleton* getInstance();
private:
     Singleton(){}
     Singleton(const Singleton&) = delete;  //明確拒絕
    Singleton& operator=(const Singleton&) = delete; //明確拒絕

    static Singleton* m_pSingleton;
 };

 Singleton* Singleton::m_pSingleton = new Singleton();

 Singleton* Singleton::getInstance()
{
    return m_pSingleton;
}

懶漢式:加lock鸟悴,線程安全
std::mutex mt;
class Singleton
{
public:
    static Singleton* getInstance();
private:
    Singleton(){}
    Singleton(const Singleton&) = delete;  //明確拒絕
    Singleton& operator=(const Singleton&) = delete; //明確拒絕

    static Singleton* m_pSingleton;

};
Singleton* Singleton::m_pSingleton = NULL;

Singleton* Singleton::getInstance()
{
    if(m_pSingleton == NULL)
    {
        mt.lock();
        m_pSingleton = new Singleton();
        mt.unlock();
    }
    return m_pSingleton;
}
 //END

工廠模式

工廠模式:簡單工廠模式陈辱、工廠方法模式、抽象工廠模式
1)细诸、簡單工廠模式:主要特點(diǎn)是需要在工廠類中做判斷沛贪,從而創(chuàng)造相應(yīng)的產(chǎn)品,當(dāng)增加新產(chǎn)品時(shí)震贵,需要修改工廠類利赋。
2)、工廠方法模式:是指定義一個(gè)創(chuàng)建對象的接口猩系,讓子類決定實(shí)例化哪一個(gè)類媚送,F(xiàn)actory Method使一個(gè)類的實(shí)例化延遲到其子類。
主要解決:主要解決接口選擇的問題寇甸。
何時(shí)使用:我們明確地計(jì)劃不同條件下創(chuàng)建不同實(shí)例時(shí)塘偎。
如何解決:讓其子類實(shí)現(xiàn)工廠接口,返回的也是一個(gè)抽象的產(chǎn)品幽纷。
關(guān)鍵代碼:創(chuàng)建過程在其子類執(zhí)行式塌。
缺點(diǎn):每增加一種產(chǎn)品,就需要增加一個(gè)對象工廠友浸。相比簡單工廠模式峰尝,工廠方法模式需要定義更多的類。
3)收恢、抽象工廠模式:提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴的對象接口武学,而無需指定它們的具體類。
主要解決:主要解決接口選擇的問題伦意。
何時(shí)使用:系統(tǒng)的產(chǎn)品有多于一個(gè)的產(chǎn)品族火窒,而系統(tǒng)只消費(fèi)其中某一族的產(chǎn)品。
如何解決:在一個(gè)產(chǎn)品族里面驮肉,定義多個(gè)產(chǎn)品熏矿。
關(guān)鍵代碼:在一個(gè)工廠里聚合多個(gè)同類產(chǎn)品。
缺點(diǎn):產(chǎn)品族擴(kuò)展非常困難离钝,要增加一個(gè)系列的某一產(chǎn)品票编,既要在抽象的 Creator 里加代碼,又要在具體的里面加代碼卵渴。

適配器模式

適配器模式:將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另一個(gè)接口慧域,使得原本由于接口不兼容而不能一起工作的哪些類可以一起工作。
主要解決:主要解決在軟件系統(tǒng)中浪读,常常要將一些"現(xiàn)存的對象"放到新的環(huán)境中昔榴,而新環(huán)境要求的接口是現(xiàn)對象不能滿足的辛藻。
何時(shí)使用: 1、系統(tǒng)需要使用現(xiàn)有的類互订,而此類的接口不符合系統(tǒng)的需要吱肌。 2、想要建立一個(gè)可以重復(fù)使用的類屁奏,用于與一些彼此之間沒有太大關(guān)聯(lián)的一些類岩榆,包括一些可能在將來引進(jìn)的類一起工作,這些源類不一定有一致的接口坟瓢。 3勇边、通過接口轉(zhuǎn)換,將一個(gè)類插入另一個(gè)類系中折联。(比如老虎和飛禽粒褒,現(xiàn)在多了一個(gè)飛虎,在不增加實(shí)體的需求下诚镰,增加一個(gè)適配器奕坟,在里面包容一個(gè)虎對象,實(shí)現(xiàn)飛的接口清笨。)
如何解決:繼承或依賴(推薦)月杉。
關(guān)鍵代碼:適配器繼承或依賴已有的對象,實(shí)現(xiàn)想要的目標(biāo)接口抠艾。
缺點(diǎn):1苛萎、過多地使用適配器,會讓系統(tǒng)非常零亂检号,不易整體進(jìn)行把握腌歉。比如,明明看到調(diào)用的是 A 接口齐苛,其實(shí)內(nèi)部被適配成了 B 接口的實(shí)現(xiàn)翘盖,一個(gè)系統(tǒng)如果太多出現(xiàn)這種情況,無異于一場災(zāi)難凹蜂。因此如果不是很有必要馍驯,可以不使用適配器,而是直接對系統(tǒng)進(jìn)行重構(gòu)玛痊。

代理模式

代理模式:為其它對象提供一種代理以控制對這個(gè)對象的訪問泥彤。
主要解決:在直接訪問對象時(shí)帶來的問題,比如:要訪問的對象在遠(yuǎn)程服務(wù)器上卿啡。在面向?qū)ο笙到y(tǒng)中,有些對象由于某些原因菱父,直接訪問會給使用者或系統(tǒng)帶來很多麻煩颈娜,可以在訪問此對象時(shí)加上一個(gè)對此對象的訪問層剑逃。
如何解決:增加中間代理層。
關(guān)鍵代碼:實(shí)現(xiàn)與被代理類組合官辽。

策略模式

策略模式:是指定義一系列的算法蛹磺,把它們一個(gè)個(gè)封裝起來,并且使它們可以互相替換同仆。使得算法可以獨(dú)立于使用它的客戶而變化萤捆,也就是說這些算法所完成的功能是一樣的,對外接口是一樣的俗批,只是各自現(xiàn)實(shí)上存在差異俗或。
主要解決:在有多種算法相似的情況下,使用 if...else 所帶來的復(fù)雜和難以維護(hù)岁忘。
何時(shí)使用:一個(gè)系統(tǒng)有許多許多類辛慰,而區(qū)分它們的只是他們直接的行為。
如何解決:將這些算法封裝成一個(gè)一個(gè)的類干像,任意地替換帅腌。
關(guān)鍵代碼:實(shí)現(xiàn)同一個(gè)接口。
缺點(diǎn): 1麻汰、策略類會增多速客。 2、所有策略類都需要對外暴露五鲫。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末溺职,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子臣镣,更是在濱河造成了極大的恐慌辅愿,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件忆某,死亡現(xiàn)場離奇詭異点待,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)弃舒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門癞埠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人聋呢,你說我怎么就攤上這事苗踪。” “怎么了削锰?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵通铲,是天一觀的道長。 經(jīng)常有香客問我器贩,道長颅夺,這世上最難降的妖魔是什么朋截? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮吧黄,結(jié)果婚禮上部服,老公的妹妹穿的比我還像新娘。我一直安慰自己拗慨,他們只是感情好廓八,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著赵抢,像睡著了一般剧蹂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上昌讲,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天国夜,我揣著相機(jī)與錄音,去河邊找鬼短绸。 笑死车吹,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的醋闭。 我是一名探鬼主播窄驹,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼证逻!你這毒婦竟也來了乐埠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤囚企,失蹤者是張志新(化名)和其女友劉穎丈咐,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體龙宏,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡棵逊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了银酗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辆影。...
    茶點(diǎn)故事閱讀 38,809評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖黍特,靈堂內(nèi)的尸體忽然破棺而出蛙讥,到底是詐尸還是另有隱情,我是刑警寧澤灭衷,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布次慢,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏经备。R本人自食惡果不足惜拭抬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望侵蒙。 院中可真熱鬧,春花似錦傅蹂、人聲如沸纷闺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽犁功。三九已至,卻和暖如春婚夫,著一層夾襖步出監(jiān)牢的瞬間浸卦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工案糙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留限嫌,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓时捌,卻偏偏與公主長得像怒医,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子奢讨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容