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

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

單例模式

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

單例的實(shí)現(xiàn)主要有兩種:懶漢式和餓漢式
懶漢:故名思義,不到萬(wàn)不得已就不會(huì)去實(shí)例化類(lèi),也就是說(shuō)在第一次用到類(lèi)實(shí)例的時(shí)候才會(huì)去實(shí)例化,所以上邊的經(jīng)典方法被歸為懶漢實(shí)現(xiàn);
餓漢:餓了肯定要饑不擇食。所以在單例類(lèi)定義的時(shí)候就進(jìn)行實(shí)例化。
特點(diǎn)與選擇:
由于要進(jìn)行線程同步,所以在訪問(wèn)量比較大,或者可能訪問(wèn)的線程比較多時(shí),采用餓漢實(shí)現(xiàn),可以實(shí)現(xiàn)更好的性能。這是以空間換時(shí)間。
在訪問(wèn)量較小時(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

工廠模式

工廠模式:簡(jiǎn)單工廠模式、工廠方法模式、抽象工廠模式
1)、簡(jiǎn)單工廠模式:主要特點(diǎn)是需要在工廠類(lèi)中做判斷,從而創(chuàng)造相應(yīng)的產(chǎn)品,當(dāng)增加新產(chǎn)品時(shí),需要修改工廠類(lèi)。
2)、工廠方法模式:是指定義一個(gè)創(chuàng)建對(duì)象的接口,讓子類(lèi)決定實(shí)例化哪一個(gè)類(lèi),F(xiàn)actory Method使一個(gè)類(lèi)的實(shí)例化延遲到其子類(lèi)。
主要解決:主要解決接口選擇的問(wèn)題。
何時(shí)使用:我們明確地計(jì)劃不同條件下創(chuàng)建不同實(shí)例時(shí)。
如何解決:讓其子類(lèi)實(shí)現(xiàn)工廠接口,返回的也是一個(gè)抽象的產(chǎn)品。
關(guān)鍵代碼:創(chuàng)建過(guò)程在其子類(lèi)執(zhí)行。
缺點(diǎn):每增加一種產(chǎn)品,就需要增加一個(gè)對(duì)象工廠。相比簡(jiǎn)單工廠模式,工廠方法模式需要定義更多的類(lèi)。
3)、抽象工廠模式:提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴(lài)的對(duì)象接口,而無(wú)需指定它們的具體類(lèi)。
主要解決:主要解決接口選擇的問(wè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è)同類(lèi)產(chǎn)品。
缺點(diǎn):產(chǎn)品族擴(kuò)展非常困難,要增加一個(gè)系列的某一產(chǎn)品,既要在抽象的 Creator 里加代碼,又要在具體的里面加代碼。

適配器模式

適配器模式:將一個(gè)類(lèi)的接口轉(zhuǎn)換成客戶希望的另一個(gè)接口,使得原本由于接口不兼容而不能一起工作的哪些類(lèi)可以一起工作。
主要解決:主要解決在軟件系統(tǒng)中,常常要將一些"現(xiàn)存的對(duì)象"放到新的環(huán)境中,而新環(huán)境要求的接口是現(xiàn)對(duì)象不能滿足的。
何時(shí)使用: 1、系統(tǒng)需要使用現(xiàn)有的類(lèi),而此類(lèi)的接口不符合系統(tǒng)的需要。 2、想要建立一個(gè)可以重復(fù)使用的類(lèi),用于與一些彼此之間沒(méi)有太大關(guān)聯(lián)的一些類(lèi),包括一些可能在將來(lái)引進(jìn)的類(lèi)一起工作,這些源類(lèi)不一定有一致的接口。 3、通過(guò)接口轉(zhuǎn)換,將一個(gè)類(lèi)插入另一個(gè)類(lèi)系中。(比如老虎和飛禽,現(xiàn)在多了一個(gè)飛虎,在不增加實(shí)體的需求下,增加一個(gè)適配器,在里面包容一個(gè)虎對(duì)象,實(shí)現(xiàn)飛的接口。)
如何解決:繼承或依賴(lài)(推薦)。
關(guān)鍵代碼:適配器繼承或依賴(lài)已有的對(duì)象,實(shí)現(xiàn)想要的目標(biāo)接口。
缺點(diǎn):1、過(guò)多地使用適配器,會(huì)讓系統(tǒng)非常零亂,不易整體進(jìn)行把握。比如,明明看到調(diào)用的是 A 接口,其實(shí)內(nèi)部被適配成了 B 接口的實(shí)現(xiàn),一個(gè)系統(tǒng)如果太多出現(xiàn)這種情況,無(wú)異于一場(chǎng)災(zāi)難。因此如果不是很有必要,可以不使用適配器,而是直接對(duì)系統(tǒng)進(jìn)行重構(gòu)。

代理模式

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

策略模式

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容