iOS 設(shè)計模式的應(yīng)用 ⑤ 建造者模式

前言

????選擇建造自己房子的人會把工程外包給承包商功氨。單一承包商不能建造整個房子序苏,他將其分解為幾個部分,然后轉(zhuǎn)包給幾個實際的建筑商捷凄〕老辏客戶告訴承包商房子里都有什么,然后承包商協(xié)調(diào)指導(dǎo)各房屋建筑商跺涤,決定需要做什么匈睁,應(yīng)該如何建造。將建造過程分解為 客戶-指導(dǎo)者(承包商)- 建造者(建筑商)的關(guān)系桶错,過程更容易管理與復(fù)用航唆,針對此類關(guān)系的設(shè)計模式稱為建造者模式

什么是建造者模式

????有時院刁,構(gòu)建某些對象有多種不同方式糯钙,其通常由各個部分的子對象用一定的算法構(gòu)成;由于需求的變化退腥,這個復(fù)雜對象的各個部分經(jīng)常面臨著劇烈的變化任岸,但是將它們組合在一起的算法卻相對穩(wěn)定。將一個復(fù)雜對象的構(gòu)建與它的表現(xiàn)分離狡刘,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表現(xiàn)享潜。建造者模式(Builder Pattern)使用多個簡單的對象一步一步構(gòu)建成一個復(fù)雜的對象。

建造者模式的類圖.png

傳統(tǒng)建造者模式有4個角色颓帝。

  • Product: 最終要生成的對象
  • Builder: 構(gòu)建者的抽象基類(有時會使用協(xié)議代替)米碰。其定義了構(gòu)建 Product的抽象步驟窝革,其實體類需要實現(xiàn)這些步驟。其會包含一個用來返回最終產(chǎn)品的方法 Product getProduct()吕座。
  • ConcreteBuilder : Builder的實現(xiàn)類虐译。
  • Director: 決定如何構(gòu)建最終產(chǎn)品的算法. 其會包含一個負責(zé)組裝的方法void Construct(Builder builder), 在這個方法中通過調(diào)用 builder 的方法吴趴,就可以設(shè)置 builder漆诽,等設(shè)置完成后,就可以通過builder的 getProduct() 方法獲得最終的產(chǎn)品锣枝。

什么時候使用建造者模式

  • 一些基本部件不會變厢拭,而其組合經(jīng)常變化的時候,構(gòu)建需要以不同的方式構(gòu)建對象

  • 需要生成的對象具有復(fù)雜的內(nèi)部結(jié)構(gòu)

  • 需要生成的對象內(nèi)部屬性本身相互依賴撇叁。

建造者模式的優(yōu)缺點

優(yōu)點

  1. 建造者獨立供鸠,易擴展。
  2. 便于控制細節(jié)風(fēng)險陨闹。

缺點

  1. 產(chǎn)品必須有共同點楞捂,范圍有限制。
  2. 如內(nèi)部變化復(fù)雜趋厉,會有很多的建造類寨闹。

建造者與抽象工廠的對比

建造者 抽象工廠
構(gòu)建復(fù)雜對象 構(gòu)建簡單或復(fù)雜對象
以多個步驟構(gòu)建對象 以單一步驟構(gòu)建對象
以多種方式構(gòu)建對象 以單一方式構(gòu)建對象
在構(gòu)建過程的最后一步返回產(chǎn)品 立刻返回產(chǎn)品
專注一個特定產(chǎn)品 強調(diào)一套產(chǎn)品

建造者模式的實現(xiàn)

????以假想的游戲角色為例,假定有兩個類型的角色——敵人和游戲者君账,角色具有共同的基本特征繁堡,如力量,耐力乡数,智力椭蹄、敏捷和攻擊力。每一個特征都影響著角色的防御(protection)和攻擊(Power)能力瞳脓,因此我們定義一個角色類 Character:

@interface Character : NSObject 

@property (nonatomic, assign) float protection;
@property (nonatomic, assign) float power;
@property (nonatomic, assign) float strength;
@property (nonatomic, assign) float stamina;
@property (nonatomic, assign) float intelligence;
@property (nonatomic, assign) float agility;
@property (nonatomic, assign) float aggressiveness;

@end
@implementation Character
- (instancetype)init
{
    self = [super init];
    if (self) {
        _protection = 1.0;
        _power = 1.0;
        _strength = 1.0;
        _stamina = 1.0;
        _intelligence = 1.0;
        _agility = 1.0;
        _aggressiveness = 1.0;
    }
    return self;
}
@end

????接著塑娇,我們定義抽象的角色構(gòu)建者 CharacterBuilder

@interface CharacterBuilder : NSObject 
{
  @protected
  Character *_character;
}

@property (nonatomic, readonly) Character *character;

- (CharacterBuilder *) buildNewCharacter;
- (CharacterBuilder *) buildStrength:(float) value;
- (CharacterBuilder *) buildStamina:(float) value;
- (CharacterBuilder *) buildIntelligence:(float) value;
- (CharacterBuilder *) buildAgility:(float) value;
- (CharacterBuilder *) buildAggressiveness:(float) value;

@end
@implementation CharacterBuilder
@synthesize character=_character;
- (CharacterBuilder *) buildNewCharacter
{
  _character = [[Character alloc] init];  
  return self;
}

- (CharacterBuilder *) buildStrength:(float) value
{
  _character.strength = value;
  return self;
}

- (CharacterBuilder *) buildStamina:(float) value
{
  _character.stamina = value;
  return self;
}

- (CharacterBuilder *) buildIntelligence:(float) value
{
  _character.intelligence = value;
  return self;
}

- (CharacterBuilder *) buildAgility:(float) value
{
  _character.agility = value;
  return self;
}

- (CharacterBuilder *) buildAggressiveness:(float) value
{
  _character.aggressiveness = value;
  return self;
}

@end

????StandardCharacterBuilder 是具體的 CharacterBuilder。在這里劫侧,力量和耐力與防御和攻擊成正比,智力和敏捷與防御成正比哨啃,與攻擊成反比烧栋。根據(jù)不同特征因子實際構(gòu)建角色。構(gòu)建過程結(jié)束后拳球,StandardCharacterBuilder 將返回 Character的實例审姓。

@interface StandardCharacterBuilder : CharacterBuilder 
{

}

// overriden methods from the abstract CharacterBuilder
- (CharacterBuilder *) buildStrength:(float) value;
- (CharacterBuilder *) buildStamina:(float) value;
- (CharacterBuilder *) buildIntelligence:(float) value;
- (CharacterBuilder *) buildAgility:(float) value;
- (CharacterBuilder *) buildAggressiveness:(float) value;

@end
@implementation StandardCharacterBuilder

- (CharacterBuilder *) buildStrength:(float) value
{
  // update the protection value of the character
  _character.protection *= value;
  
  // update the power value of the character
  _character.power *= value;
  
  // finally set the strength value and return this builder
  return [super buildStrength:value];
}

- (CharacterBuilder *) buildStamina:(float) value
{
  // update the protection value of the character
  _character.protection *= value;
  
  // update the power value of the character
  _character.power *= value;
  
  // finally set the strength value and return this builder
  return [super buildStamina:value];
}

- (CharacterBuilder *) buildIntelligence:(float) value
{
  // update the protection value of the character
  _character.protection *= value;
  
  // update the power value of the character
  _character.power /= value;
  
  // finally set the strength value and return this builder
  return [super buildIntelligence:value];
}

- (CharacterBuilder *) buildAgility:(float) value
{
  // update the protection value of the character
  _character.protection *= value;
  
  // update the power value of the character
  _character.power /= value;
  
  // finally set the strength value and return this builder
  return [super buildAgility:value];
}

- (CharacterBuilder *) buildAggressiveness:(float) value
{
  // update the protection value of the character
  _character.protection /= value;
  
  // update the power value of the character
  _character.power *= value;
  
  // finally set the strength value and return this builder
  return [super buildAggressiveness:value];
}


@end

接下來,定義指導(dǎo)者 ChasingGame 類祝峻,其提供了創(chuàng)建游戲者和敵人角色的方法魔吐。

@interface ChasingGame : NSObject 
{

}

- (Character *) createPlayer:(CharacterBuilder *) builder;
- (Character *) createEnemy:(CharacterBuilder *) builder;

@end
@implementation ChasingGame

- (Character *) createPlayer:(CharacterBuilder *) builder
{

  // an alternative way to build a character
  [[[[[[builder buildNewCharacter]
       buildStrength:50.0]
      buildStamina:25.0]
     buildIntelligence:75.0]
    buildAgility:65.0]
   buildAggressiveness:35.0];
  
  return [builder character];
}

- (Character *) createEnemy:(CharacterBuilder *) builder
{
  [builder buildNewCharacter];
  [builder buildStrength:80.0];
  [builder buildStamina:65.0];
  [builder buildIntelligence:35.0];
  [builder buildAgility:25.0];
  [builder buildAggressiveness:95.0];
  
  return [builder character];
}

@end

最后扎筒,只需要通過 StandardCharacterBuilderChasingGame 就可以創(chuàng)建相應(yīng)的游戲和敵人角色。

  
  CharacterBuilder *characterBuilder = [[[StandardCharacterBuilder alloc] init] autorelease];
  ChasingGame *game = [[[ChasingGame alloc] init] autorelease];
  
  Character *player = [game createPlayer:characterBuilder];
  Character *enemy = [game createEnemy:characterBuilder];

總結(jié)

????建造者模式能幫助構(gòu)建涉及部件與表現(xiàn)的各種組合的對象酬姆。沒有這一模式嗜桌,知道構(gòu)建對象所需細節(jié)的 Director 可能最終會變成一個龐大的類,帶有無數(shù)用于構(gòu)建同一個類的各種表現(xiàn)的內(nèi)嵌算法辞色。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末骨宠,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子相满,更是在濱河造成了極大的恐慌层亿,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件立美,死亡現(xiàn)場離奇詭異匿又,居然都是意外死亡,警方通過查閱死者的電腦和手機建蹄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門琳省,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人躲撰,你說我怎么就攤上這事针贬。” “怎么了拢蛋?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵桦他,是天一觀的道長。 經(jīng)常有香客問我谆棱,道長快压,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任垃瞧,我火速辦了婚禮蔫劣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘个从。我一直安慰自己脉幢,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布嗦锐。 她就那樣靜靜地躺著嫌松,像睡著了一般。 火紅的嫁衣襯著肌膚如雪奕污。 梳的紋絲不亂的頭發(fā)上萎羔,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機與錄音碳默,去河邊找鬼贾陷。 笑死缘眶,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的髓废。 我是一名探鬼主播巷懈,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼瓦哎!你這毒婦竟也來了砸喻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤蒋譬,失蹤者是張志新(化名)和其女友劉穎割岛,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體犯助,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡癣漆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了剂买。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惠爽。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖瞬哼,靈堂內(nèi)的尸體忽然破棺而出婚肆,到底是詐尸還是另有隱情,我是刑警寧澤坐慰,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布较性,位于F島的核電站,受9級特大地震影響结胀,放射性物質(zhì)發(fā)生泄漏赞咙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一糟港、第九天 我趴在偏房一處隱蔽的房頂上張望攀操。 院中可真熱鬧,春花似錦秸抚、人聲如沸速和。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽健芭。三九已至,卻和暖如春秀姐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背若贮。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工省有, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留痒留,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓蠢沿,卻偏偏與公主長得像伸头,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子舷蟀,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345

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

  • 1.定義 建造者模式使用多個簡單的對象一步一步構(gòu)建成一個復(fù)雜的對象恤磷。這種類型設(shè)計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)...
    132xin閱讀 110評論 0 3
  • 前言 建造者模式又被稱呼為生成器模式野宜,這種類型的設(shè)計模式屬于創(chuàng)建型模式扫步,它提供了一種創(chuàng)建對象的最佳方式。使用多個簡...
    斌林誠上閱讀 39,182評論 7 65
  • 一匈子、建造者模式 1河胎、定義:將一個復(fù)雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示 2虎敦、主要作用:...
    藍色Hippie閱讀 172評論 0 0
  • 一游岳、概念 1、建造者模式的動機 ? 沒有人買車會只買一個輪胎或者方向盤其徙,大家買的都是一輛包含輪胎胚迫、方向盤和發(fā)動機...
    阿餅six閱讀 691評論 0 3
  • 1、建造者模式簡述 建造者模式(Builder)唾那,又叫生成器模式將一個復(fù)雜對象的構(gòu)建與它的表示分離访锻,使得同樣的構(gòu)建...
    YotrolZ閱讀 492評論 0 1