1.5設計模式之建造者模式(Builder)

1.5.1 模式意圖:

當面臨一個復雜對象的創(chuàng)建時锭弊,通常由各個子對象按照一定的順序組合而成玄组;隨著需求的不斷變化凫乖,復雜對象對應的各個子對象也隨之變化,但組合順序相對穩(wěn)定吟宦。我們需要將一個復雜的構(gòu)建與其表示相分離篮洁,使得同樣的構(gòu)建過程或順序可以創(chuàng)建不同的復雜對象。使用建造者模式即可達到這樣的目的殃姓。

1.5.2 模式概念:

將一個復雜的構(gòu)建與其表示相分離袁波,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。使用多個簡單的對象一步一步構(gòu)建成一個復雜的對象蜗侈。這種類型的設計模式屬于創(chuàng)建型模式篷牌,它提供了一種創(chuàng)建對象的最佳方式。

1.5.3 模式元素:

  • 抽象建造者(AbstractBuilder)
  • 具體建造者(HouseBuilder)
  • 指揮者(Director)
  • 產(chǎn)品角色(House踏幻、Cement枷颊、Brick等)

1.5.4 代碼示例:

寫一個建造房子的例子:首先你要準備水泥,鋼筋叫倍,磚塊偷卧,然后蓋一層、二層吆倦、三層直到最高層听诸,通電,通水等等多道“工序”才能完成成品蚕泽。其中每一道工序都是對產(chǎn)品的全新創(chuàng)建晌梨、但是我們只關(guān)心最后的終極產(chǎn)品---【房子】。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Custom.Log;

# region BaseClass
/// <summary>
/// 水泥
/// </summary>
public class Cement { }
/// <summary>
/// 磚塊
/// </summary>
public class Brick { }
/// <summary>
/// 鋼筋
/// </summary>
public class Rebar { }
/// <summary>
/// 樓層
/// </summary>
public class Floor { }

/// <summary>
/// 水
/// </summary>
public class Water { }
/// <summary>
/// 電
/// </summary>
public class Electricity { }
/// <summary>
/// 房屋
/// </summary>
public class House { }
#endregion
public abstract class AbstractBuilder
{
    public abstract void Build_Cement();
    public abstract void Build_Brick();
    public abstract void Build_Rebar();
    public abstract void Build_Floor();
    public abstract void Build_Water();
    public abstract void Build_Electricity();
    public abstract House Build_House();
}

public class HouseBuilder : AbstractBuilder
{
    public override void Build_Brick()
    {
        this.Log("建造磚塊");
    }
    public override void Build_Cement()
    {
        this.Log("建造水泥");
    }
    public override void Build_Electricity()
    {
        this.Log("建造電力");
    }
    public override void Build_Floor()
    {
        this.Log("建造樓層");
    }
    public override void Build_Rebar()
    {
        this.Log("建造鋼筋");
    }
    public override void Builde_Water()
    {
        this.Log("建造水");
    }
    public override House Build_House()
    {
        this.Log("房屋建造完成");
        return new House();
    }
}

public class Director
{
    private AbstractBuilder abstractBuilder = null;

    public Director(AbstractBuilder tempAbstractBuilder)
    {
        abstractBuilder = tempAbstractBuilder;
    }

    public House GetResult()
    {
        abstractBuilder.Build_Brick();//建造磚塊
        abstractBuilder.Build_Cement();//建造水泥
        abstractBuilder.Build_Rebar();//建造鋼筋
        abstractBuilder.Build_Floor();//建造樓層
        abstractBuilder.Build_Electricity();//電力完成
        abstractBuilder.Build_Water();//水源完成
        House temp =  abstractBuilder.Builde_House();//成品房屋完成
        this.Log($"完全品{temp}完成");
        return temp;
    }
}

調(diào)用

public class BuilderComponent : MonoBehaviour
{
    void Start()
    {
        AbstractBuilder abstractBuilder = new HouseBuilder();
        Director director = new Director(abstractBuilder);
        House house = director.GetResult();
    }
}

打印信息

1.5.5 寫法對比:

1.5.6 模式分析:

下面筆者和大家具體分析一下建造者模式须妻,其實這個和抽象工廠模式特別的相似仔蝌,都是創(chuàng)建產(chǎn)品,但建造者模式只是把原有工廠的創(chuàng)建函數(shù)交給了指揮者(Director)來執(zhí)行。從寫法上講荒吏,我認為【AbstractFactoryPlus】【Builder】更貼切敛惊,就是讓多行的創(chuàng)建代碼演變成現(xiàn)在的Director director = new Director(abstractBuilder);House house = director.GetResult();,從結(jié)構(gòu)上看是把原本的創(chuàng)建過程再次的封裝和轉(zhuǎn)移绰更,如果想修改創(chuàng)建過程可以直接在Director類中修改瞧挤。最后通過Director組裝,在組裝的過程中可以不斷的向一個容器內(nèi)添加儡湾,獲取最終的產(chǎn)品特恬。

從職責劃分上看:
【抽象工廠】主要是沒有元素或者說一個元素對應一個產(chǎn)品,以這種方式產(chǎn)出多個產(chǎn)品徐钠。
【建造者模式】是多個元素建造一個產(chǎn)品癌刽。目的是關(guān)心一個復雜產(chǎn)品的構(gòu)建過程(再次封裝和轉(zhuǎn)移)。

指揮者(Director)主要是用于創(chuàng)建一些復雜的對象,這些對象內(nèi)部的構(gòu)建順序通常是穩(wěn)定的显拜,但對象內(nèi)部的構(gòu)建通常面臨著復雜的變化衡奥。不過真的需要建造順序更改時,我們也可以重新定義一個新的Director讼油,只需要把原有的Director類替換掉就可以杰赛,上層的改動也相對較小,絕對的開閉原則是不存在的矮台,相對的開閉才是我們應該掌握的。

【擴展說明】

或許有人會問根时,為什么不用接口代替對應的AbstractBuilder呢瘦赫?
筆者是這樣理解的,接口是一個獨立的功能蛤迎,不是一個系統(tǒng)确虱。以手機為例:它含有上網(wǎng)、聽音樂替裆、看電影校辩、儲存、拍照辆童、收發(fā)信息等功能宜咒,每一個功能都可以是一個接口。且這種接口具有通用性把鉴。

問什么說是通用性故黑?
例如上網(wǎng)功能接口電腦也可以繼承,拍照這種功能接口專業(yè)攝像機也可以繼承這就是通用性庭砍。這種微小獨立功能的劃分也符合接口隔離原則场晶。

但是抽象類呢,它更像一個特殊的縮小系統(tǒng)怠缸,就像手機是眾多電子產(chǎn)品中的一種诗轻,但手機的品牌很多,基于這種縮小系統(tǒng)基本一致性的特點揭北,不同的品牌扳炬,我們就可以根據(jù)手機抽象類實現(xiàn)不同的品牌實例。而且在抽象基類里面可以實現(xiàn)一些字段和函數(shù)罐呼,接口則不能鞠柄。

接口是能夠,抽象是含有嫉柴。

【舉例說明】

List這種就是集各種通用功能于一身的

這種文件操作的抽象類就很局限了

1.5.7 應用場景:

  • 生成的對象具有復雜的內(nèi)部結(jié)構(gòu)厌杜。
  • 生成的對象內(nèi)部屬性本身相互依賴。

1.5.8 小結(jié):

  • 筆者認為,如果構(gòu)建過程相對簡單夯尽,2-5行代碼可以解決的問題用工廠模式就可以了瞧壮,如果十分復雜的創(chuàng)建就可以考慮下建造者模式。

  • 建造者模式的好處就是使得建造代碼與表示代碼分離匙握,由于建造者隱藏了該產(chǎn)品的組裝順序和細節(jié)咆槽,所以若需要改變一個產(chǎn)品的內(nèi)部表示,只需要再定義一個具體的建造者(示例中的BuilderHouse)就可以了圈纺。


更多設計模式詳見:設計模式全家桶

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末秦忿,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蛾娶,更是在濱河造成了極大的恐慌灯谣,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛔琅,死亡現(xiàn)場離奇詭異胎许,居然都是意外死亡,警方通過查閱死者的電腦和手機罗售,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門辜窑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人寨躁,你說我怎么就攤上這事穆碎。” “怎么了朽缎?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵惨远,是天一觀的道長。 經(jīng)常有香客問我话肖,道長北秽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任最筒,我火速辦了婚禮贺氓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘床蜘。我一直安慰自己辙培,他們只是感情好,可當我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布邢锯。 她就那樣靜靜地躺著扬蕊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪丹擎。 梳的紋絲不亂的頭發(fā)上尾抑,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天歇父,我揣著相機與錄音,去河邊找鬼再愈。 笑死榜苫,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的翎冲。 我是一名探鬼主播垂睬,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼抗悍!你這毒婦竟也來了驹饺?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤缴渊,失蹤者是張志新(化名)和其女友劉穎逻淌,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疟暖,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年田柔,在試婚紗的時候發(fā)現(xiàn)自己被綠了俐巴。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡硬爆,死狀恐怖欣舵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情缀磕,我是刑警寧澤缘圈,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站袜蚕,受9級特大地震影響糟把,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜牲剃,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一遣疯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧凿傅,春花似錦缠犀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至箱残,卻和暖如春滔迈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工亡鼠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留赏殃,地道東北人。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓间涵,卻偏偏與公主長得像仁热,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子勾哩,可洞房花燭夜當晚...
    茶點故事閱讀 44,941評論 2 355

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

  • 設計模式概述 在學習面向?qū)ο笃叽笤O計原則時需要注意以下幾點:a) 高內(nèi)聚抗蠢、低耦合和單一職能的“沖突”實際上,這兩者...
    彥幀閱讀 3,747評論 0 14
  • 沒有人買車會只買一個輪胎或者方向盤思劳,大家買的都是一輛包含輪胎迅矛、方向盤和發(fā)動機等多個部件的完整汽車。如何將這些部件組...
    justCode_閱讀 1,842評論 1 6
  • 【學習難度:★★★★☆潜叛,使用頻率:★★☆☆☆】直接出處:建造者模式梳理和學習:https://github.com...
    BruceOuyang閱讀 774評論 0 5
  • 定義 建造模式是對象的創(chuàng)建模式秽褒。建造模式可以將一個產(chǎn)品的內(nèi)部表象(internal representation)...
    步積閱讀 6,957評論 1 7
  • 今天準備回老家,大烽吃完早飯趕緊寫作業(yè)威兜,但過程中寫的很慢销斟,到十一點才寫完,匆匆忙忙收拾一下椒舵,去市場買點東西蚂踊,...
    李烽熠媽閱讀 115評論 0 2