設(shè)計(jì)模式| 創(chuàng)建型模式

前言

GOF23種設(shè)計(jì)模式中創(chuàng)建型模式共五種:工廠方法模式报强、抽象工廠模式懒鉴、單例模式犬性、建造者模式瞻离、原型模式。

 工廠模式主要是為創(chuàng)建對(duì)象提供過渡接口乒裆,以便將創(chuàng)建對(duì)象的具體過程屏蔽隔離起來套利,達(dá)到提高靈活性的目的。
 工廠模式中有三種形態(tài):Simple Factory簡單工廠模式鹤耍、Factory Method工廠方法模式肉迫、Abstract Factory抽象工廠模式。

其他同系列的文章還有:
面向?qū)ο缶幊讨械牧笤瓌t
設(shè)計(jì)模式| 創(chuàng)建型模式
設(shè)計(jì)模式| 結(jié)構(gòu)型模式
設(shè)計(jì)模式| 行為型模式 (上)
設(shè)計(jì)模式| 行為型模式 (下)
歡迎閱讀稿黄,評(píng)論:吧馈!杆怕!

工廠模式的主要實(shí)現(xiàn)原理是:

1.抽象(接口或者抽象類)出公共的產(chǎn)品族购,抽象出公共的工廠,
2.具體的產(chǎn)品是公共產(chǎn)品的實(shí)現(xiàn)或者子類陵珍,具體的工廠是公共工廠的實(shí)現(xiàn)或者子類寝杖。
3.因?yàn)楣驳漠a(chǎn)品、公共的工廠的存在互纯,使得不同的具體產(chǎn)品在對(duì)外可以返回相同的產(chǎn)品瑟幕,不同的工廠都可以調(diào)用相同的方法。
4.相當(dāng)于工廠(不同的工廠)出來的產(chǎn)品都是相同的殼子留潦,都有相同的方法只盹,
  但是殼子里面具體是什么產(chǎn)品和方法執(zhí)行后的結(jié)果是什么取決于真正產(chǎn)品的類實(shí)現(xiàn)。
5.具體產(chǎn)出什么產(chǎn)品由參數(shù)兔院、特定的具體工廠的初始化以及方法的調(diào)用殖卑,無法實(shí)現(xiàn)自動(dòng)化創(chuàng)建產(chǎn)品,
  主要的目的是為了代碼的好維護(hù)和擴(kuò)展秆乳。

工廠模式的主要使用場景:

作為一種創(chuàng)建類模式懦鼠,在任何需要生成復(fù)雜對(duì)象的地方钻哩,都可以使用工廠方法模式。
有一點(diǎn)需要注意的地方就是復(fù)雜對(duì)象適合使用工廠模式肛冶,
而簡單對(duì)象街氢,特別是只需要通過new就可以完成創(chuàng)建的對(duì)象,無需使用工廠模式睦袖。
如果使用工廠模式珊肃,就需要引入一個(gè)工廠類,會(huì)增加系統(tǒng)的復(fù)雜度馅笙。

其次伦乔,工廠模式是一種典型的解耦模式,迪米特法則在工廠模式中表現(xiàn)的尤為明顯董习。
假如調(diào)用者自己組裝產(chǎn)品需要增加依賴關(guān)系時(shí)烈和,可以考慮使用工廠模式。將會(huì)大大降低對(duì)象之間的耦合度皿淋。

再次招刹,由于工廠模式是依靠抽象架構(gòu)的,它把實(shí)例化產(chǎn)品的任務(wù)交由實(shí)現(xiàn)類完成窝趣,擴(kuò)展性比較好疯暑。
也就是說,當(dāng)需要系統(tǒng)有比較好的擴(kuò)展性時(shí)哑舒,可以考慮工廠模式妇拯,不同的產(chǎn)品用不同的實(shí)現(xiàn)工廠來組裝。

0洗鸵、簡單工廠模式

簡單工廠(又被稱為靜態(tài)工廠)模式是最簡單的工廠模式主要用于生產(chǎn)同一等級(jí)結(jié)構(gòu)中的任意產(chǎn)品或者方案越锈,
簡單工廠模式涉及抽象產(chǎn)品(Product)角色及具體產(chǎn)品(Concrete Product)角色、工廠角色(Factory )等三個(gè)角色预麸。

實(shí)現(xiàn)的過程是這樣:抽象出一個(gè)抽象產(chǎn)品瞪浸,實(shí)現(xiàn)抽象產(chǎn)品后形成很多具體產(chǎn)品類,
               一個(gè)工廠類中方法中吏祸,根據(jù)不同的參數(shù),定向生產(chǎn)出特定的具體產(chǎn)品钩蚊。
               但增加新的產(chǎn)品贡翘,就要修改原工廠類,符合單一職責(zé)原則砰逻,不符合開放-封閉原則鸣驱。

1、工廠方法模式

1.通俗來說就是一個(gè)產(chǎn)品的生產(chǎn)過程蝠咆,分解到了兩個(gè)抽象過程踊东,一個(gè)是自身產(chǎn)品的抽象北滥,一個(gè)是生產(chǎn)出這個(gè)產(chǎn)品的工廠抽象,
2.所以實(shí)際的生產(chǎn)流程中闸翅,有多少種產(chǎn)品就會(huì)有有多少個(gè)對(duì)應(yīng)的工廠一一對(duì)應(yīng)再芋,達(dá)到特定工廠生產(chǎn)特定產(chǎn)品。
3.在后續(xù)添加新產(chǎn)品的時(shí)候坚冀,實(shí)現(xiàn)一個(gè)對(duì)應(yīng)的新工廠即可济赎,擴(kuò)展性非常的好。
4.根據(jù)需要记某,實(shí)現(xiàn)特定的工廠即可司训。

工廠方法模式和簡單工廠的區(qū)別:工廠方法模式只是把簡單工廠中的工廠實(shí)體類化為兩層:抽象工廠類和實(shí)際產(chǎn)品的工廠實(shí)體類,
更利于擴(kuò)展液南。

2壳猜、抽象工廠模式

工廠方法模式通過引入工廠等級(jí)結(jié)構(gòu),解決了簡單工廠模式中工廠類職責(zé)太重的問題滑凉,
但由于工廠方法模式中的每個(gè)工廠只生產(chǎn)一類產(chǎn)品蓖谢,可能會(huì)導(dǎo)致系統(tǒng)中存在大量的工廠類,勢必會(huì)增加系統(tǒng)的開銷譬涡。
此時(shí)闪幽,我們可以考慮將一些相關(guān)的產(chǎn)品組成一個(gè)“產(chǎn)品族”,
由同一個(gè)工廠來統(tǒng)一生產(chǎn)涡匀,這就是我們本文將要學(xué)習(xí)的抽象工廠模式的基本思想盯腌。

因?yàn)楸容^抽象,下面舉個(gè)例子:
抽象產(chǎn)品:car陨瘩、suv
具體產(chǎn)品:高端car腕够、高端suv
        中端car、中端suv
        低端car舌劳、低端suv   
抽象工廠:工廠 (生產(chǎn)car帚湘、生產(chǎn)suv)
具體工廠:高端工廠(生產(chǎn)高端car、高端suv)
        中端工廠(生產(chǎn)中端car甚淡、中端suv)
        低端工廠(生產(chǎn)低端car大诸、低端suv)
高端car、高端suv 就算一個(gè)產(chǎn)品族 

以上就是抽象工廠模式:實(shí)現(xiàn)一個(gè)具體工廠生產(chǎn)出多個(gè)具體產(chǎn)品的效果贯卦。

3资柔、單例模式

定義:確保一個(gè)類只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例撵割。

為什么使用單例模式

需要確保某個(gè)類只要一個(gè)對(duì)象贿堰,
或創(chuàng)建一個(gè)類需要消耗的資源過多,如訪問IO和數(shù)據(jù)庫操作等啡彬,這時(shí)就需要考慮使用單例模式了羹与。

4故硅、建造者模式

復(fù)雜對(duì)象的組裝與創(chuàng)建-建造者模式

定義:將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示纵搁。
     這個(gè)概念看起來總是這么深?yuàn)W難懂吃衅。大概的意思,同一套構(gòu)建流程诡渴,但是基于不同的構(gòu)建流程細(xì)節(jié)捐晶,創(chuàng)建出了不同的產(chǎn)品(表示)。

建造者模式屬于創(chuàng)建型模式妄辩。顧名思義惑灵,builder 的意思是建造者或者建筑工人。
例如眼耀,樓房都是千差萬別英支,樓房的外形,層數(shù)哮伟,內(nèi)部房間的數(shù)量干花,房間的裝飾都不一樣。但是建筑一座樓房楞黄,抽象出來的建筑流程是確定的
都可以歸納為幾個(gè)步驟:打樁池凄、建地基、搭框架鬼廓、內(nèi)部建設(shè)等肿仑。同理,建造者設(shè)計(jì)模式也是基于這樣的概念而生的碎税,
這個(gè)設(shè)計(jì)模式用來解決什么樣的情況呢:面對(duì) "一個(gè)復(fù)雜對(duì)象" 的創(chuàng)建尤慰,其流程不變,但每個(gè)流程實(shí)現(xiàn)的具體細(xì)節(jié)是會(huì)變化的雷蹂。

四個(gè)要素:

產(chǎn)品類:一般是一個(gè)較為復(fù)雜的對(duì)象伟端,也就是說創(chuàng)建對(duì)象的過程比較復(fù)雜,一般會(huì)有比較多的代碼量匪煌。
       在本類圖中责蝠,產(chǎn)品類是一個(gè)具體的類,而非抽象類虐杯。實(shí)際編程中玛歌,
       產(chǎn)品類可以是由一個(gè)抽象類與它的不同實(shí)現(xiàn)組成,也可以是由多個(gè)抽象類與他們的實(shí)現(xiàn)組成擎椰。
抽象建造者:引入抽象建造者的目的,是為了將建造的具體過程交與它的子類來實(shí)現(xiàn)创肥。這樣更容易擴(kuò)展达舒。
          一般至少會(huì)有兩個(gè)抽象方法值朋,一個(gè)用來建造產(chǎn)品,一個(gè)是用來返回產(chǎn)品巩搏。
建造者:實(shí)現(xiàn)抽象類的所有未實(shí)現(xiàn)的方法昨登,不同的子建造者提供了不同的流程細(xì)節(jié)。
       具體來說一般是兩項(xiàng)任務(wù):組建產(chǎn)品贯底;返回組建好的產(chǎn)品丰辣。
導(dǎo)演類:負(fù)責(zé)調(diào)用適當(dāng)?shù)慕ㄔ煺邅斫M建產(chǎn)品,導(dǎo)演類一般不與產(chǎn)品類發(fā)生依賴關(guān)系禽捆,與導(dǎo)演類直接交互的是建造者類笙什。
       一般來說,導(dǎo)演類被用來封裝程序中易變的部分胚想。

A.建造者模式的優(yōu)點(diǎn)

首先琐凭,建造者模式的封裝性很好。使用建造者模式可以有效的封裝變化浊服,在使用建造者模式的場景中统屈,
一般產(chǎn)品類和建造者類是比較穩(wěn)定的,
因此牙躺,將主要的業(yè)務(wù)邏輯封裝在導(dǎo)演類中對(duì)整體而言可以取得比較好的穩(wěn)定性愁憔。

 其次,建造者模式很容易進(jìn)行擴(kuò)展孽拷。如果有新的需求吨掌,通過實(shí)現(xiàn)一個(gè)新的建造者類就可以完成,
 基本上不用修改之前已經(jīng)測試通過的代碼乓搬,因此也就不會(huì)對(duì)原有功能引入風(fēng)險(xiǎn)思犁。

B.建造者模式與工廠模式的區(qū)別

我們可以看到,建造者模式與工廠模式是極為相似的进肯,總體上激蹲,建造者模式僅僅只比工廠模式多了一個(gè)“導(dǎo)演類”的角色。
在建造者模式的類圖中江掩,假如把這個(gè)導(dǎo)演類看做是最終調(diào)用的客戶端学辱,那么圖中剩余的部分就可以看作是一個(gè)簡單的工廠模式了。

與工廠模式相比环形,建造者模式一般用來創(chuàng)建更為復(fù)雜的對(duì)象策泣,因?yàn)閷?duì)象的創(chuàng)建過程更為復(fù)雜,
因此將對(duì)象的創(chuàng)建過程獨(dú)立出來組成一個(gè)新的類——導(dǎo)演類抬吟。

也就是說萨咕,工廠模式是將對(duì)象的全部創(chuàng)建過程封裝在工廠類中,由工廠類向客戶端提供最終的產(chǎn)品火本;
而建造者模式中危队,建造者類一般只提供產(chǎn)品類中各個(gè)組件的建造聪建,而將具體建造過程交付給導(dǎo)演類。
由導(dǎo)演類負(fù)責(zé)將各個(gè)組件按照特定的規(guī)則組建為產(chǎn)品茫陆,然后將組建好的產(chǎn)品交付給客戶端金麸。

C.總結(jié)

建造者模式與工廠模式類似,他們都是建造者模式簿盅,適用的場景也很相似挥下。

一般來說,如果產(chǎn)品的建造很復(fù)雜桨醋,那么請(qǐng)用工廠模式棚瘟;如果產(chǎn)品的建造更復(fù)雜,那么請(qǐng)用建造者模式讨盒。

5解取、原型模式

對(duì)象的克隆-原型模式

原型模式是非常簡單的一種設(shè)計(jì)模式, 在多數(shù)情況下可被理解為一種深復(fù)制的行為。

在Objective-C中使用原型模式, 首先要遵循NSCoping協(xié)議(OC中一些內(nèi)置類遵循該協(xié)議, 
例如NSArray, NSMutableArray等)返顺。剛才我們提到了深復(fù)制, 一圖以蔽之:
深復(fù)制就是開辟新內(nèi)存實(shí)現(xiàn)真正的內(nèi)存復(fù)制, 淺復(fù)制, 只復(fù)制指針, 堆內(nèi)存不變. 在我們設(shè)計(jì)系統(tǒng)時(shí),
有時(shí)一些對(duì)象需要根據(jù)用戶操作完成拷貝備份等操作, 這時(shí)候, 如果再去按照原來的方法初始化一遍對(duì)象就會(huì)帶來一些不便和問題:

1.該對(duì)象的某些屬性是在用戶操作過程中產(chǎn)生的,不能夠僅憑一個(gè) initXXX 方法賦值;
2. 常規(guī)賦值太過麻煩復(fù)雜, 而且破壞封裝.

常見的使用場景:
1. 結(jié)構(gòu)復(fù)雜的類型, 例如《編程之道》中提及的Mark類型禀苦; 或者是相似類, 結(jié)構(gòu)一致, 但是屬性不同.
2.不管是什么對(duì)象,只要復(fù)制自身比手工實(shí)例化要好遂鹊,都可以是原型對(duì)象振乏。

好處:

1.使用原型模式創(chuàng)建對(duì)象比直接new一個(gè)對(duì)象在性能上要好的多,因?yàn)镺bject類的clone方法是一個(gè)本地方法秉扑,
  它直接操作內(nèi)存中的二進(jìn)制流慧邮,特別是復(fù)制大對(duì)象時(shí),性能的差別非常明顯舟陆。
2.使用原型模式的另一個(gè)好處是簡化對(duì)象的創(chuàng)建误澳,使得創(chuàng)建對(duì)象就像我們在編輯文檔時(shí)的復(fù)制粘貼一樣簡單。
3.在需要重復(fù)地創(chuàng)建相似對(duì)象時(shí)可以考慮使用原型模式秦躯。比如需要在一個(gè)循環(huán)體內(nèi)創(chuàng)建對(duì)象忆谓,
  假如對(duì)象創(chuàng)建過程比較復(fù)雜或者循環(huán)次數(shù)很多的話,使用原型模式不但可以簡化創(chuàng)建過程踱承,而且可以使系統(tǒng)的整體性能提高很多倡缠。

參考文章:
https://blog.csdn.net/crazymo_/article/details/72848566

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市茎活,隨后出現(xiàn)的幾起案子昙沦,更是在濱河造成了極大的恐慌,老刑警劉巖载荔,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盾饮,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)丐谋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門芍碧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來煌珊,“玉大人号俐,你說我怎么就攤上這事《ㄢ郑” “怎么了吏饿?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蔬浙。 經(jīng)常有香客問我猪落,道長,這世上最難降的妖魔是什么畴博? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任笨忌,我火速辦了婚禮,結(jié)果婚禮上俱病,老公的妹妹穿的比我還像新娘官疲。我一直安慰自己,他們只是感情好亮隙,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布途凫。 她就那樣靜靜地躺著,像睡著了一般溢吻。 火紅的嫁衣襯著肌膚如雪维费。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天促王,我揣著相機(jī)與錄音犀盟,去河邊找鬼。 笑死蝇狼,一個(gè)胖子當(dāng)著我的面吹牛阅畴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播题翰,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼恶阴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了豹障?” 一聲冷哼從身側(cè)響起冯事,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎血公,沒想到半個(gè)月后昵仅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年摔笤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了够滑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡吕世,死狀恐怖彰触,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情命辖,我是刑警寧澤况毅,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站尔艇,受9級(jí)特大地震影響尔许,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜终娃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一味廊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧棠耕,春花似錦余佛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至搅荞,卻和暖如春红氯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背咕痛。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來泰國打工痢甘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人茉贡。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓塞栅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親腔丧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子放椰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

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