iOS開發(fā)之建造者模式(Builder Pattern)

使用多個簡單的對象一步一步構(gòu)建成一個復(fù)雜的對象。這種類型的設(shè)計模式屬于創(chuàng)建型模式蓬网,它提供了一種創(chuàng)建對象的最佳方式窒所。
一個 Builder 類會一步一步構(gòu)造最終的對象。該 Builder 類是獨立于其他對象的帆锋。

介紹

意圖:將一個復(fù)雜的構(gòu)建與其表示相分離吵取,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。

主要解決:主要解決在軟件系統(tǒng)中锯厢,有時候面臨著"一個復(fù)雜對象"的創(chuàng)建工作皮官,其通常由各個部分的子對象用一定的算法構(gòu)成;由于需求的變化实辑,這個復(fù)雜對象的各個部分經(jīng)常面臨著劇烈的變化捺氢,但是將它們組合在一起的算法卻相對穩(wěn)定。

何時使用:一些基本部件不會變剪撬,而其組合經(jīng)常變化的時候摄乒。

如何解決:將變與不變分離開。

關(guān)鍵代碼:建造者:創(chuàng)建和提供實例残黑,導(dǎo)演:管理建造出來的實例的依賴關(guān)系馍佑。

應(yīng)用實例: 1、去肯德基梨水,漢堡拭荤、可樂、薯條疫诽、炸雞翅等是不變的舅世,而其組合是經(jīng)常變化的,生成出所謂的"套餐"奇徒。

優(yōu)點: 1歇终、建造者獨立,易擴(kuò)展逼龟。 2评凝、便于控制細(xì)節(jié)風(fēng)險。

缺點: 1腺律、產(chǎn)品必須有共同點奕短,范圍有限制。 2匀钧、如內(nèi)部變化復(fù)雜翎碑,會有很多的建造類。

使用場景: 1之斯、需要生成的對象具有復(fù)雜的內(nèi)部結(jié)構(gòu)日杈。 2、需要生成的對象內(nèi)部屬性本身相互依賴。

注意事項:與工廠模式的區(qū)別是:建造者模式更加關(guān)注與零件裝配的順序莉擒。

建造者模式:

建模:

Setp 1:

創(chuàng)建抽象產(chǎn)品協(xié)議 <IProduct>.

#import <Foundation/Foundation.h>

@protocol IProduct <NSObject>

// 飲料
- (void)drink:(NSString *)drink;
// 食物
- (void)food:(NSString *)food;
// 小吃
- (void)snack::(NSString *)snack;

@end

Setp 2:

創(chuàng)建具體的產(chǎn)品類 KFCMeals (實現(xiàn)了 <IProduct> 協(xié)議).

// .h 
#import <Foundation/Foundation.h>
#import "IProduct.h"

@interface KFCMeals : NSObject<IProduct>
@end

// .m
#import "KFCMeals.h"

@implementation KFCMeals

// 飲料
- (void)drink:(NSString *)drink {
    NSLog(@"選取KFC飲料為:%@",drink);
}
// 食物
- (void)food:(NSString *)food {
    NSLog(@"選取KFC食物為:%@",food);
}
// 小吃
- (void)snack:(NSString *)snack {
    NSLog(@"選取KFC小吃為:%@",snack);
}

@end

Setp 3:

創(chuàng)建抽象產(chǎn)品建造者協(xié)議 <IProductBuilder>.

#import <Foundation/Foundation.h>
#import "IProduct.h"

@protocol IProductBuilder <NSObject>

// 建造飲料
- (id<IProductBuilder>)buildDrink:(NSString *)drink;
// 建造食物
- (id<IProductBuilder>)buildFood:(NSString *)food;
// 建造小吃
- (id<IProductBuilder>)buildSnack:(NSString *)snack;
// 建造套餐
- (id<IProduct>)buildMeals;

@end

Setp 4:

實現(xiàn)具體的產(chǎn)品類 KFCMealsBuilder (實現(xiàn)了 <IProductBuilder> 協(xié)議).

// .h
#import <Foundation/Foundation.h>
#import "IProductBuilder.h"

@interface KFCMealsBuilder : NSObject<IProductBuilder>
@end

// .m
#import "KFCMealsBuilder.h"
#import "KFCMeals.h"

@interface KFCMealsBuilder()

@property (nonatomic ,strong)id<IProduct> meals;

@end

@implementation KFCMealsBuilder

// 套餐建造者 持有 套餐 的引用
- (instancetype)init {
    if (self = [super init]) {
        _meals = [[KFCMeals alloc] init];
    }
    return self;
}

// 這種鏈?zhǔn)秸{(diào)用就是典型的Builder的應(yīng)用

// 建造飲料
- (id<IProductBuilder>)buildDrink:(NSString *)drink {
    
    [_meals drink:drink];
    return self;
}
// 建造食物
- (id<IProductBuilder>)buildFood:(NSString *)food {
    
    [_meals food:food];
    return self;
}
// 建造小吃
- (id<IProductBuilder>)buildSnack:(NSString *)snack {
 
    [_meals snack:snack];
    return self;
}
// 建造套餐
- (id<IProduct>)buildMeals {
    NSLog(@"生成了一個KFC套餐酿炸。");
    
    return _meals;
}

@end

Setp 5:

創(chuàng)建統(tǒng)一組裝類 Director (可省略不實現(xiàn)).

// .h
#import <Foundation/Foundation.h>
#import "IProductBuilder.h"

@interface Director : NSObject

// 構(gòu)造函數(shù)
- (instancetype)initWithBuilder:(id<IProductBuilder>)builder;

// 建造產(chǎn)品的方法
- (void)constructDrink:(NSString *)drink
                  food:(NSString *)food
                 snack:(NSString *)snack;

@end

// .m
#import "Director.h"

@interface Director()

@property (nonatomic, strong)id<IProductBuilder> builder;

@end

@implementation Director

- (instancetype)initWithBuilder:(id<IProductBuilder>)builder {
    if (self = [super init]) {
        _builder = builder;
    }
    return self;
}

- (void)constructDrink:(NSString *)drink
                  food:(NSString *)food
                 snack:(NSString *)snack {
    
    [[[[_builder buildDrink:drink] buildFood:food] buildSnack:snack] buildMeals];
}

@end

Setp 6:測試

導(dǎo)入頭文件 #import "KFCMealsBuilder.h"#import "Director.h"

測試一:(有統(tǒng)一組裝類的方法)

id<IProductBuilder> builder = [[KFCMealsBuilder alloc] init];
Director *dir = [[Director alloc] initWithBuilder:builder];
[dir constructDrink:@"牛奶" food:@"漢堡" snack:@"薯條"];

控制臺打印結(jié)果:

測試二:(無統(tǒng)一組裝類的方法)
開發(fā)中大多數(shù)情況下都是使用的該種方案。

id<IProductBuilder> builder = [[KFCMealsBuilder alloc] init];
[[[[builder buildDrink:@"牛奶"] buildSnack:@"雞塊"] buildFood:@"雞肉卷"] buildMeals];

控制臺打印結(jié)果:


到此建造者模式就完成了涨冀,如果有不同的見解歡迎討論~
代碼放在GitHub上了填硕,有需要查看的可以 -> 戳這里。


千里之行鹿鳖,始于足下扁眯。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市翅帜,隨后出現(xiàn)的幾起案子姻檀,更是在濱河造成了極大的恐慌,老刑警劉巖涝滴,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绣版,死亡現(xiàn)場離奇詭異,居然都是意外死亡狭莱,警方通過查閱死者的電腦和手機(jī)僵娃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門概作,熙熙樓的掌柜王于貴愁眉苦臉地迎上來腋妙,“玉大人,你說我怎么就攤上這事讯榕≈杷兀” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵愚屁,是天一觀的道長济竹。 經(jīng)常有香客問我,道長霎槐,這世上最難降的妖魔是什么送浊? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮丘跌,結(jié)果婚禮上袭景,老公的妹妹穿的比我還像新娘。我一直安慰自己闭树,他們只是感情好耸棒,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著报辱,像睡著了一般与殃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天幅疼,我揣著相機(jī)與錄音米奸,去河邊找鬼。 笑死衣屏,一個胖子當(dāng)著我的面吹牛躏升,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播狼忱,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼膨疏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了钻弄?” 一聲冷哼從身側(cè)響起佃却,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎窘俺,沒想到半個月后饲帅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡瘤泪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年灶泵,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片对途。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡赦邻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出实檀,到底是詐尸還是另有隱情惶洲,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布膳犹,位于F島的核電站恬吕,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏须床。R本人自食惡果不足惜铐料,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望豺旬。 院中可真熱鬧钠惩,春花似錦、人聲如沸哈垢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽耘分。三九已至举塔,卻和暖如春绑警,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背央渣。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工计盒, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人芽丹。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓北启,卻偏偏與公主長得像,于是被迫代替她去往敵國和親拔第。 傳聞我的和親對象是個殘疾皇子咕村,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

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

  • 沒有人買車會只買一個輪胎或者方向盤,大家買的都是一輛包含輪胎蚊俺、方向盤和發(fā)動機(jī)等多個部件的完整汽車懈涛。如何將這些部件組...
    justCode_閱讀 1,825評論 1 6
  • 【學(xué)習(xí)難度:★★★★☆,使用頻率:★★☆☆☆】直接出處:建造者模式梳理和學(xué)習(xí):https://github.com...
    BruceOuyang閱讀 765評論 0 5
  • 模式動機(jī) 無論是在現(xiàn)實世界中還是在軟件系統(tǒng)中泳猬,都存在一些復(fù)雜的對象批钠,它們擁有多個組成部分,如汽車得封,它包括車輪埋心、方向...
    lijun_m閱讀 412評論 0 0
  • 定義 建造模式是對象的創(chuàng)建模式。建造模式可以將一個產(chǎn)品的內(nèi)部表象(internal representation)...
    步積閱讀 6,936評論 1 7
  • 一個人倘若需要從思想中得到快樂忙上,那么他的第一個欲望就是學(xué)習(xí)拷呆。 只是雖然可以帶來幸福,但假如把它壓縮成藥丸子灌下去晨横,...
    心徹閱讀 159評論 2 2