前言
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