十一朋譬、建造者模式

1. 何為建造者模式

定義:將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表現(xiàn)分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表現(xiàn)者冤。

建造者模式負(fù)責(zé)將構(gòu)建復(fù)雜對(duì)象的過(guò)程和它的部件解耦肤视,也就是過(guò)程和部件的解耦。比如說(shuō)汽車(chē)涉枫,是一個(gè)很復(fù)雜的對(duì)象邢滑,它有很多的部件,車(chē)輪愿汰、發(fā)動(dòng)機(jī)困后、座椅、車(chē)門(mén)衬廷、郵箱等等摇予;它的組裝過(guò)程也很復(fù)雜(需要專(zhuān)業(yè)人士按照步驟進(jìn)行裝配),建造者模式就是為了將部件和組裝過(guò)程分開(kāi)吗跋。

建造者模式最大的好處就是使得構(gòu)建過(guò)程和表現(xiàn)分離侧戴,因此若需要改變一個(gè)產(chǎn)品的表現(xiàn),只需重新定義一個(gè)具體的建造者就可以了跌宛。舉個(gè)例子酗宋,我們將車(chē)的組裝過(guò)程獨(dú)立處來(lái),用這個(gè)組裝過(guò)程可以組裝出寶馬疆拘、奔馳或者其他車(chē)型蜕猫,如果要組裝新的車(chē)型,我們只需要重新定義一個(gè)具體的構(gòu)造者(用于產(chǎn)品表現(xiàn)的類(lèi))就可以了哎迄。

2. 情景設(shè)置

在軟件系統(tǒng)中丹锹,有時(shí)候會(huì)遇到一個(gè)復(fù)雜對(duì)象(比如上面例子中的汽車(chē))的創(chuàng)建,它通常由幾個(gè)部分的子對(duì)象采用一定的算法(過(guò)程)構(gòu)成芬失;由于需求的變化楣黍,這個(gè)復(fù)雜對(duì)象的各個(gè)部分經(jīng)常面臨著劇烈的變化(比如上面例子中,各種車(chē)型用的車(chē)門(mén)棱烂、方向盤(pán)租漂、發(fā)動(dòng)機(jī)等,是不一樣的),但是將各個(gè)部分組合在一起的算法(過(guò)程)時(shí)相對(duì)穩(wěn)定的哩治。

建造者模式就是在這樣的需求下誕生的秃踩,它封裝了變化點(diǎn)(組成部分),使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表現(xiàn)业筏。建造者模式結(jié)構(gòu)圖如圖2-1所示:

圖2-1

從結(jié)構(gòu)圖可以看到憔杨,生成器模式有兩個(gè)重要的角色:Director(指導(dǎo)者)和Builder(建造者)。Director知道Builder應(yīng)該建造什么(建造的過(guò)程)蒜胖,Builder知道如何建造(表現(xiàn))消别。在Director類(lèi)中定義了一個(gè)construct方法,指導(dǎo)具體的建造者ConcreteBuilder的對(duì)象去buildPart台谢。Builder是一個(gè)抽象接口(協(xié)議)寻狂,該協(xié)議中包含建造各個(gè)部分的方法(buildPart),用來(lái)構(gòu)建實(shí)際的產(chǎn)品Product朋沮,另外還有一個(gè)getResult方法蛇券,用來(lái)向客戶(hù)端返回構(gòu)建完成的Product。

這樣說(shuō)不知道大家是不是感覺(jué)很抽象樊拓?那咱們用一個(gè)生活的例子來(lái)通俗點(diǎn)說(shuō)纠亚。比如現(xiàn)在我要在老家修一個(gè)房子,首先我不知道怎么修房子(砌墻筋夏,缺建造者)菜枷,然后我也不知道怎么設(shè)計(jì)(修幾個(gè)房間,房間的布局叁丧,房間的窗戶(hù)怎么設(shè)計(jì)等等,缺指導(dǎo)者)岳瞭,于是我找來(lái)一幫民工(建造者)拥娄,他們會(huì)砌墻;另外我還得找設(shè)計(jì)師(指導(dǎo)者)瞳筏,他知道怎么設(shè)計(jì)稚瘾;最后,我還要確保民工(建造者)聽(tīng)設(shè)計(jì)師(指導(dǎo)者)的指導(dǎo)姚炕,哪里需要砌一堵墻摊欠,哪里需要安裝窗戶(hù)等等,這樣民工(建造者)就開(kāi)始蓋房子柱宦,在這個(gè)建造過(guò)程中些椒,設(shè)計(jì)師(指導(dǎo)者)只負(fù)責(zé)設(shè)計(jì)和下達(dá)命令。房子建成功后掸刊,民工(建造者)向我交房免糕。說(shuō)白了,就是Director(指導(dǎo)者)負(fù)責(zé)把控宏觀方面(過(guò)程),Builder(建造者)負(fù)責(zé)把控微觀方面(表現(xiàn)) 石窑。

3. 代碼實(shí)現(xiàn)

(1)Product

@interface Product : NSObject
{
    NSMutableArray *arrParts;
}

- (void)addPart:(NSString *)part;  // 添加產(chǎn)品的各個(gè)部分
- (void)show;  // 展示產(chǎn)品

@end


@implementation Product

- (instancetype)init
{
    if (self = [super init]) {
        arrParts = [NSMutableArray array];
    }
    return self;
}

- (void)addPart:(NSString *)part
{
    [arrParts addObject:part];
}

- (void)show
{
    for (NSString *strPart in arrParts)
    {
        NSLog(@"%@",strPart);
    }
}

@end

(2)Builder

@class Product;
@protocol Builder <NSObject>

- (void)addPartOne;
- (void)addPartTwo;
- (Product *)getResult;

@end

(3)Director

@interface Director : NSObject

- (void)construct:(id<Builder>)builder;

@end


@implementation Director

- (void)construct:(id<Builder>)builder
{
    [builder addPartOne];
    [builder addPartTwo];
}

@end

(4)ConcreteBuilder

@interface ConcreteBuilder : NSObject<Builder>
{
    Product     *product;
}

@end


@implementation ConcreteBuilder

- (instancetype)init
{
    if (self = [super init]) {
        product = [[Product alloc] init];
    }
    return self;
}

- (void)addPartOne
{
    [product addPart:@"part one"];
}

- (void)addPartTwo
{
    [product addPart:@"part two"];
}

- (Product *)getResult
{
    return product;
}
@end

(5)客戶(hù)端調(diào)用

 Director *director = [[Director alloc] init];
 id<Builder> builder = [[ConcreteBuilder alloc] init];
        
[director construct:builder];
Product *product = [builder getResult];
[product show];

建造者模式常用于如下情形:

a. 需要?jiǎng)?chuàng)建涉及各種部件的復(fù)雜對(duì)象牌芋。創(chuàng)建對(duì)象的算法應(yīng)該獨(dú)立于部件的裝配方式。
b. 構(gòu)建過(guò)程需要以不同的方式構(gòu)建對(duì)象松逊。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末躺屁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子经宏,更是在濱河造成了極大的恐慌犀暑,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件烛恤,死亡現(xiàn)場(chǎng)離奇詭異母怜,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)缚柏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)苹熏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人币喧,你說(shuō)我怎么就攤上這事轨域。” “怎么了杀餐?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵干发,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我史翘,道長(zhǎng)枉长,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任琼讽,我火速辦了婚禮必峰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘钻蹬。我一直安慰自己吼蚁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布问欠。 她就那樣靜靜地躺著肝匆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪顺献。 梳的紋絲不亂的頭發(fā)上旗国,一...
    開(kāi)封第一講書(shū)人閱讀 52,475評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音注整,去河邊找鬼粗仓。 笑死嫁怀,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的借浊。 我是一名探鬼主播塘淑,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蚂斤!你這毒婦竟也來(lái)了存捺?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤曙蒸,失蹤者是張志新(化名)和其女友劉穎捌治,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體纽窟,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡肖油,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了臂港。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片森枪。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖审孽,靈堂內(nèi)的尸體忽然破棺而出县袱,到底是詐尸還是另有隱情,我是刑警寧澤佑力,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布式散,位于F島的核電站,受9級(jí)特大地震影響打颤,放射性物質(zhì)發(fā)生泄漏暴拄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一编饺、第九天 我趴在偏房一處隱蔽的房頂上張望乖篷。 院中可真熱鬧,春花似錦反肋、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至畅形,卻和暖如春养距,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背日熬。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工棍厌, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓耘纱,卻偏偏與公主長(zhǎng)得像敬肚,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子束析,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

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

  • 沒(méi)有人買(mǎi)車(chē)會(huì)只買(mǎi)一個(gè)輪胎或者方向盤(pán)艳馒,大家買(mǎi)的都是一輛包含輪胎、方向盤(pán)和發(fā)動(dòng)機(jī)等多個(gè)部件的完整汽車(chē)员寇。如何將這些部件組...
    justCode_閱讀 1,849評(píng)論 1 6
  • 1 場(chǎng)景問(wèn)題# 1.1 繼續(xù)導(dǎo)出數(shù)據(jù)的應(yīng)用框架## 在討論工廠方法模式的時(shí)候弄慰,提到了一個(gè)導(dǎo)出數(shù)據(jù)的應(yīng)用框架。 對(duì)于...
    七寸知架構(gòu)閱讀 5,760評(píng)論 1 64
  • 建造者模式(生成器模式) 介紹 沒(méi)有人買(mǎi)車(chē)會(huì)只買(mǎi)一個(gè)輪胎或者方向盤(pán)蝶锋,大家買(mǎi)的都是一輛包含輪胎陆爽、方向盤(pán)和發(fā)動(dòng)機(jī)等多個(gè)...
    666真666閱讀 5,296評(píng)論 2 10
  • 累與不累, 取決于自己的心態(tài)扳缕。 心靈的房間慌闭, 不打掃就會(huì)落滿灰塵。 掃地除塵第献, 能夠 使黯然的心變得亮堂贡必; 把事情...
    旖旎i閱讀 262評(píng)論 0 0
  • 君王城上豎降旗仔拟,妾在深宮哪得知。 十四萬(wàn)人齊謝甲飒赃,更無(wú)一人是男兒利花。 ——五代花蕊夫人《述亡國(guó)詩(shī)》 花蕊夫人一生著述...
    文泉杰閱讀 2,012評(píng)論 5 14