設(shè)計模式之建造者模式

一摄狱、建造者模式簡介

將一個復雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示无午。建造者模式是一種對象創(chuàng)建型模式媒役。

屏幕快照 2018-09-02 下午2.48.24.png
屏幕快照 2018-09-02 下午5.50.46.png
  • Builder(抽象建造者):它為創(chuàng)建一個產(chǎn)品Product對象的各個部件指定抽象接口,在該接口中一般聲明兩類方法宪迟,一類方法是buildPartX()酣衷,它們用于創(chuàng)建復雜對象的各個部件;另一類方法是getResult()次泽,它們用于返回復雜對象穿仪。Builder既可以是抽象類席爽,也可以是接口。

  • ConcreteBuilder(具體建造者):它實現(xiàn)了Builder接口啊片,實現(xiàn)各個部件的具體構(gòu)造和裝配方法只锻,定義并明確它所創(chuàng)建的復雜對象,也可以提供一個方法返回創(chuàng)建好的復雜產(chǎn)品對象紫谷。

  • Product(產(chǎn)品角色):它是被構(gòu)建的復雜對象齐饮,包含多個組成部件,具體建造者創(chuàng)建該產(chǎn)品的內(nèi)部表示并定義它的裝配過程碴里。

  • Director(指揮者):指揮者又稱為導演類沈矿,它負責安排復雜對象的建造次序,指揮者與抽象建造者之間存在關(guān)聯(lián)關(guān)系咬腋,可以在其construct()建造方法中調(diào)用建造者對象的部件構(gòu)造與裝配方法,完成復雜對象的建造睡互「停客戶端一般只需要與指揮者進行交互,在客戶端確定具體建造者的類型就珠,并實例化具體建造者對象寇壳,然后通過指揮者類的初始化函數(shù)或者Setter方法將該對象傳入指揮者類中。

二妻怎、用來解決什么問題

想象一下壳炎,我們有個非常復雜的對象需要構(gòu)造,這個復雜對象是指那些包含多個成員屬性的對象逼侦,這些成員屬性也稱為部件或零件匿辩,如汽車包括方向盤、發(fā)動機榛丢、輪胎等部件铲球,電子郵件包括發(fā)件人、收件人晰赞、主題稼病、內(nèi)容、附件等部件掖鱼。接下來我們以汽車對象為例進行描述然走。如果想要構(gòu)造一個汽車對象,那么就需要按照一定的步驟先將其內(nèi)部的部件構(gòu)造完畢戏挡,最終構(gòu)造出一個完整的汽車對象芍瑞,這個過程可能還會包含一些其他的邏輯判斷。當不使用建造者模式的時候增拥,汽車對象的構(gòu)造可能就在某個類(客戶端)當中進行啄巧,這個類集合了以下的一些職責:

  • 選擇創(chuàng)建一個什么樣的汽車寻歧,奔馳還是奧迪?(存在大量邏輯判斷)

  • 按照一定的順序構(gòu)造一輛完整的汽車秩仆。

  • 構(gòu)造汽車的零部件并最終生成一輛汽車码泛。

想做到這些,這個類必須知道所有的關(guān)于構(gòu)造汽車的細節(jié)澄耍,很明顯噪珊,這樣的代碼不容易復用,并且違反了單一職責原則齐莲。

建造者模式能夠很容易的解決上述問題痢站。

  • 按一定的構(gòu)造順序構(gòu)造汽車的職責抽離到Director當中,由Director來判斷將用什么樣的構(gòu)造順序構(gòu)造一個具體的對象选酗。

  • 構(gòu)造零部件并生成一輛汽車的職責抽離的Builder當中阵难,Buiiler負責零部件具體的構(gòu)造細節(jié),并最終構(gòu)造出一輛汽車芒填。

經(jīng)過職責的分離呜叫,現(xiàn)在客戶端只需要知道,他想要一輛什么樣的汽車殿衰,并將能夠生產(chǎn)該汽車的Builder告知Director朱庆,Director內(nèi)部就會使用這個Builder去按照一定的順序構(gòu)造出一輛客戶端需要的汽車,并返回給客戶端闷祥。

現(xiàn)在可以來看看這個模式解決了什么問題了:

  1. 分離復雜對象構(gòu)建的職責娱颊,隔離股咋對象的創(chuàng)建和使用。使得代碼可復用凯砍,并且容易擴展箱硕。

  2. 屏蔽一切客戶端不需要知道的細節(jié),暴露出客戶端需要知道的接口果覆。

三颅痊、使用場景

  • 需要生成的產(chǎn)品對象有復雜的內(nèi)部結(jié)構(gòu),這些產(chǎn)品對象通常包含多個成員屬性局待。

  • 需要生成的產(chǎn)品對象的屬性相互依賴斑响,需要指定其生成順序。

  • 對象的創(chuàng)建過程獨立于創(chuàng)建該對象的類钳榨。在建造者模式中通過引入了指揮者類舰罚,將創(chuàng)建過程封裝在指揮者類中,而不在建造者類和客戶類中薛耻。

  • 隔離復雜對象的創(chuàng)建和使用营罢,并使得相同的創(chuàng)建過程可以創(chuàng)建不同的產(chǎn)品。

四、使用實例

LOL當中英雄眾多饲漾,但他們都有一些共有的屬性蝙搔,如發(fā)型,身體考传,武器等等吃型。這些英雄的構(gòu)造順序大同小異,加入我們現(xiàn)在要構(gòu)造兩個英雄僚楞,蠻王和皇子(玩過英雄聯(lián)盟的人應該都知道這兩個英雄)勤晚。

通過建造者模式,我們將這兩個英雄的構(gòu)造順序放到Director當中泉褐,將其命名為HeroBuildDirector赐写。具體的構(gòu)造細節(jié)(發(fā)型,身體膜赃,武器)放入兩個不同的Builder當中挺邀,我將他們分別命名為ManBuilderHuangBuilder,這兩個Builder都實現(xiàn)了公共的Builder接口财剖。通過HeroBuildDirector的構(gòu)造順序悠夯,生產(chǎn)出來叫做Hero的產(chǎn)品(Product)。現(xiàn)在躺坟,客戶端只需要將合適的Builder傳給Director即可得到想要的英雄∪樾睿客戶端的代碼最終應該如下:

Builder *builder = [[ManBuilder alloc] init];//蠻王的構(gòu)造者
HeroBuildDirector *director = [[HeroBuildDirector alloc] initWithHeroBuilder:builder];
Hero *hero = [director construct];

相關(guān)鏈接:https://blog.csdn.net/lovelion/article/details/17517213

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末咪橙,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子虚倒,更是在濱河造成了極大的恐慌美侦,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件魂奥,死亡現(xiàn)場離奇詭異菠剩,居然都是意外死亡,警方通過查閱死者的電腦和手機耻煤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門具壮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人哈蝇,你說我怎么就攤上這事棺妓。” “怎么了炮赦?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵怜跑,是天一觀的道長。 經(jīng)常有香客問我吠勘,道長性芬,這世上最難降的妖魔是什么峡眶? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮植锉,結(jié)果婚禮上辫樱,老公的妹妹穿的比我還像新娘霹崎。我一直安慰自己惕味,他們只是感情好突委,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布十拣。 她就那樣靜靜地躺著熏矿,像睡著了一般响巢。 火紅的嫁衣襯著肌膚如雪见妒。 梳的紋絲不亂的頭發(fā)上供搀,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天鞋囊,我揣著相機與錄音止后,去河邊找鬼。 笑死溜腐,一個胖子當著我的面吹牛译株,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播挺益,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼歉糜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了望众?” 一聲冷哼從身側(cè)響起匪补,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎烂翰,沒想到半個月后夯缺,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡甘耿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年踊兜,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片佳恬。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡捏境,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出殿怜,到底是詐尸還是另有隱情典蝌,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布头谜,位于F島的核電站骏掀,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜截驮,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一笑陈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧葵袭,春花似錦涵妥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鹉勒,卻和暖如春帆锋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背禽额。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工锯厢, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人脯倒。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓实辑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親藻丢。 傳聞我的和親對象是個殘疾皇子剪撬,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

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