創(chuàng)建型設(shè)計模式-建造者模式

定義

將一個復(fù)雜對象的構(gòu)建與它的表示分離握牧,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示


主要作用

在用戶不知道對象的建造過程和細(xì)節(jié)的情況下就可以直接創(chuàng)建復(fù)雜的對象。

1. 用戶只需要給出指定復(fù)雜對象的類型和內(nèi)容相速;
2. 建造者模式負(fù)責(zé)按順序創(chuàng)建復(fù)雜對象(把內(nèi)部的建造過程和細(xì)節(jié)隱藏起來)

解決問題

 方便用戶創(chuàng)建復(fù)雜的對象(不需要知道實現(xiàn)過程)
 代碼復(fù)用性 & 封裝性(將對象構(gòu)建過程和細(xì)節(jié)進(jìn)行封裝 & 復(fù)用)

角色

  1. Builder:給出一個抽象接口,以規(guī)范產(chǎn)品對象的各個組成成分的建造鲜锚。這個接口規(guī)定要實現(xiàn)復(fù)雜對象的哪些部分的創(chuàng)建突诬,并不涉及具體的對象部件的創(chuàng)建苫拍。
  2. ConcreteBuilder:實現(xiàn)Builder接口,針對不同的商業(yè)邏輯旺隙,具體化復(fù)雜對象的各部分的創(chuàng)建绒极。 在建造過程完成后,提供產(chǎn)品的實例蔬捷。
  3. Director:調(diào)用具體建造者來創(chuàng)建復(fù)雜對象的各個部分垄提,在指導(dǎo)者中不涉及具體產(chǎn)品的信息,只負(fù)責(zé)保證對象各部分完整創(chuàng)建或按某種順序創(chuàng)建周拐。
  4. Product:要創(chuàng)建的復(fù)雜對象塔淤。

場景模擬

我們都知道汽車都是有方向盤,輪子速妖,發(fā)動機(jī)等組成的高蜂。今天小明到了4s店想買一輛汽車,向店老板說了大眾的方向盤罕容,大眾的輪子备恤,大眾的發(fā)動機(jī)。


建造者模型UML圖

image.png

代碼


@interface Car : NSObject
@property (nonatomic,strong) NSString *tire;
@property (nonatomic,strong) NSString * wheel;
@property (nonatomic,strong) NSString * engine;
@end

#import "Car.h"

@implementation Car
-(NSString *)description{
    NSLog(@"輪胎:%@ 方形盤:%@锦秒,引擎:%@",self.tire,self.wheel,self.engine);
    return nil;
}
@end
#import "Car.h"
@protocol Carbuilder <NSObject>
-(void)tire;
-(void)engine;
-(void)wheel;
-(Car*)createCar;
@end
#import "Carbuilder.h"
@interface DZCarBuilder : NSObject<Carbuilder>

@end
#import "DZCarBuilder.h"
@interface DZCarBuilder()
@property (nonatomic,strong) Car *car;
@end
@implementation DZCarBuilder
- (instancetype)init
{
    self = [super init];
    if (self) {
        self.car = [Car new];
    }
    return self;
}

-(void)tire{
    self.car.tire =@"大眾的輪胎";
}
-(void)wheel{
    self.car.wheel = @"大眾的方向盤";
}
-(void)engine
{
    self.car.engine=@"大眾的引擎";
}

-(Car *)createCar{
    return self.car;
}


@end
#import <Foundation/Foundation.h>
#import "Carbuilder.h"
@interface Director : NSObject
-(Car *)createCar:(id<Carbuilder>)carBuider;
@end
#import "Director.h"

@implementation Director
-(Car *)createCar:(id<Carbuilder>)carBuider
{
    [carBuider tire];
    [carBuider wheel];
    [carBuider engine];
    return  [carBuider createCar];
}
@end

測試代碼

    id <Carbuilder> builder= [DZCarBuilder new];
    Director * director = [Director new];
  Car *car =  [director createCar:builder];
    [car description];

測試結(jié)果

[20011:7006293] 輪胎:大眾的輪胎 方形盤:大眾的方向盤露泊,引擎:大眾的引擎
  1. 協(xié)議Carbuilder 代表的是Builder
  2. DZCarBuilder 具體是實現(xiàn)類(ConcreteBuilder)
  3. Director就是 Director
  4. Car 代表Product 類

我們想生產(chǎn)不同的車就實現(xiàn)不同的Carbuilder 就可以了。


應(yīng)用場景

建造者模式主要解決在軟件系統(tǒng)中旅择,有時候面臨著"一個復(fù)雜對象"的創(chuàng)建工作惭笑,其通常由各個部分的子對象用一定的算法構(gòu)成;由于需求的變化生真,這個復(fù)雜對象的各個部分經(jīng)常面臨著劇烈的變化沉噩,但是將它們組合在一起的算法卻相對穩(wěn)定。


優(yōu)缺點

優(yōu)點

  • 易于解耦

將產(chǎn)品本身與產(chǎn)品創(chuàng)建過程進(jìn)行解耦柱蟀,可以使用相同的創(chuàng)建過程來得到不同的產(chǎn)品川蒙。也就說細(xì)節(jié)依賴抽象。(依賴倒置原則)

  • 易于精確控制對象的創(chuàng)建

將復(fù)雜產(chǎn)品的創(chuàng)建步驟分解在不同的方法中长已,使得創(chuàng)建過程更加清晰

  • 易于拓展

增加新的具體建造者無需修改原有類庫的代碼畜眨,易于拓展,符合“開閉原則“术瓮。

 每一個具體建造者都相對獨立康聂,而與其他的具體建造者無關(guān),因此可以很方便地替換具體建造者或增加新的具體建造者胞四,用戶使用不同的具體建造者即可得到不同的產(chǎn)品對象恬汁。

缺點

  • 建造者模式所創(chuàng)建的產(chǎn)品一般具有較多的共同點,其組成部分相似撬讽;如果產(chǎn)品之間的差異性很大蕊连,則不適合使用建造者模式悬垃,因此其使用范圍受到一定的限制。
  • 如果產(chǎn)品的內(nèi)部變化復(fù)雜甘苍,可能會導(dǎo)致需要定義很多具體建造者類來實現(xiàn)這種變化尝蠕,導(dǎo)致系統(tǒng)變得很龐大

具體代碼在demo中

源代碼地址

借鑒博客
借鑒博客

下一篇博客地址
結(jié)構(gòu)性設(shè)計模式-適配器模式

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市载庭,隨后出現(xiàn)的幾起案子看彼,更是在濱河造成了極大的恐慌,老刑警劉巖囚聚,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件靖榕,死亡現(xiàn)場離奇詭異索昂,居然都是意外死亡固阁,警方通過查閱死者的電腦和手機(jī)皂岔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門咬腕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人感挥,你說我怎么就攤上這事蒋伦「戎” “怎么了鬼譬?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵娜膘,是天一觀的道長。 經(jīng)常有香客問我优质,道長竣贪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任巩螃,我火速辦了婚禮演怎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘牺六。我一直安慰自己颤枪,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布淑际。 她就那樣靜靜地躺著,像睡著了一般扇住。 火紅的嫁衣襯著肌膚如雪春缕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天艘蹋,我揣著相機(jī)與錄音锄贼,去河邊找鬼。 笑死女阀,一個胖子當(dāng)著我的面吹牛宅荤,可吹牛的內(nèi)容都是我干的屑迂。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼冯键,長吁一口氣:“原來是場噩夢啊……” “哼惹盼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起惫确,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤手报,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后改化,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掩蛤,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年陈肛,在試婚紗的時候發(fā)現(xiàn)自己被綠了揍鸟。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡句旱,死狀恐怖阳藻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情前翎,我是刑警寧澤稚配,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站港华,受9級特大地震影響道川,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜立宜,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一冒萄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧橙数,春花似錦尊流、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至钟哥,卻和暖如春迎献,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背腻贰。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工吁恍, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓冀瓦,卻偏偏與公主長得像伴奥,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子翼闽,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,871評論 2 354

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