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、所有策略類都需要對外暴露五鲫。