關(guān)注產(chǎn)出缎岗,不關(guān)心細(xì)節(jié),『建造者模式』

目錄:設(shè)計(jì)模式之小試牛刀
源碼路徑:Github-Design Pattern


定義:(Builder Pattern)

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

類圖:

建造者模式通用類圖

啟示:

采購經(jīng)理要采購一批臺式電腦,為了節(jié)約公司成本遵岩,決定組裝你辣。但是對于怎么組裝,采購經(jīng)理不知道也不關(guān)心尘执,所以就指派裝機(jī)商組裝舍哄。第一次采購的電腦是組裝的HP的臺式機(jī),
第二次采購經(jīng)理決定換個(gè)品牌誊锭,組裝DELL的臺式機(jī)表悬。對于怎么組裝HP、DELL臺式機(jī)丧靡,采購經(jīng)理不關(guān)心蟆沫。

參與者:

Builder
為創(chuàng)建一個(gè)Product對象的各個(gè)部件指定抽象接口籽暇。
ConcreteBuilder
實(shí)現(xiàn)Builder的接口以構(gòu)造和裝配該產(chǎn)品的各個(gè)部件。
定義并明確它所創(chuàng)建的表示饭庞。
提供一個(gè)檢索產(chǎn)品的接口戒悠。
Director
構(gòu)造一個(gè)使用Builder接口的對象。
Product
表示被構(gòu)造的復(fù)雜對象但绕。ConcreteBuilder創(chuàng)建該產(chǎn)品的內(nèi)部表示并定義它的裝配過程救崔。
包含定義組成部件的類,包括將這些部件裝配成最終產(chǎn)品的接口捏顺。

代碼:

先看看產(chǎn)品Product六孵,電腦的實(shí)現(xiàn)。

    /// <summary>
    /// 產(chǎn)品類
    /// </summary>
    public class Computer
    {
        /// <summary>
        /// 品牌
        /// </summary>
        public string Band { get; set; }

        /// <summary>
        /// 電腦組件列表
        /// </summary>
        private List<string> assemblyParts = new List<string>();

        /// <summary>
        /// 組裝部件
        /// </summary>
        /// <param name="partName">部件名稱</param>
        public void AssemblePart(string partName)
        {
            this.assemblyParts.Add(partName);
        }

        public void ShowSteps()
        {
            Console.WriteLine("開始組裝『{0}』電腦:", Band);
            foreach (var part in assemblyParts)
            {
                Console.WriteLine(string.Format("組裝『{0}』;", part));
            }

            Console.WriteLine("組裝『{0}』電腦完畢幅骄!", Band);
        }
    }

接下來看Builder角色劫窒,即電腦組裝商抽象類。

    /// <summary>
    /// 建造者(模擬裝機(jī)過程),也可通過接口實(shí)現(xiàn)
    /// Director不關(guān)心具體組裝的細(xì)節(jié)拆座,所以將具體的組裝細(xì)節(jié)方法標(biāo)記為protected
    /// </summary>
    public abstract class Builder
    {
        /// <summary>
        /// 組裝主機(jī)
        /// </summary>
        protected abstract void BuildMainFramePart();

        /// <summary>
        /// 組裝顯示器
        /// </summary>
        protected abstract void BuildScreenPart();

        /// <summary>
        /// 組裝輸入設(shè)備(鍵鼠)
        /// </summary>
        protected abstract void BuildInputPart();

        /// <summary>
        /// 獲取組裝電腦
        /// 由具體的組裝類決定組裝順序
        /// </summary>
        /// <returns></returns>
        public abstract Computer BuildComputer();
    }

再看看具體的ConcreteBuilder角色主巍,HP電腦組裝商的實(shí)現(xiàn)

    /// <summary>
    /// 惠普電腦組裝商
    /// </summary>
    public class HpBulider : Builder
    {
        Computer hp = new Computer() { Band = "惠普" };

        protected override void BuildMainFramePart()
        {
            hp.AssemblePart("主機(jī)");
        }

        protected override void BuildScreenPart()
        {
            hp.AssemblePart("顯示器");
        }

        protected override void BuildInputPart()
        {
            hp.AssemblePart("鍵鼠");
        }

        /// <summary>
        /// 決定具體的組裝步驟
        /// </summary>
        /// <returns></returns>
        public override Computer BuildComputer()
        {
            BuildMainFramePart();
            BuildScreenPart();
            BuildInputPart();
            return hp;
        }
    }

最后只等指揮者Director一聲令下,組裝電腦挪凑≡兴鳎看看指揮者的實(shí)現(xiàn)。

    /// <summary>
    /// 指揮者(采購經(jīng)理)
    /// </summary>
    public class Director
    {
        public Computer Construct(Builder builder)
        {
           return builder.BuildComputer();
        }
    }

場景類

        static void Main(string[] args)
        {
            Director director = new Director();
            HpBulider hpBuilder = new HpBulider();
            DellBulider dellBuilder =new DellBulider();

            //組裝一批惠普電腦
            Computer hp =director.Construct(hpBuilder);
            hp.ShowSteps();

            Console.ReadLine();

            //組裝一批戴爾電腦
            Computer dell = director.Construct(dellBuilder);
            dell.ShowSteps();

            Console.ReadLine();
        }

運(yùn)行結(jié)果

優(yōu)缺點(diǎn):

建造者隱藏了具體產(chǎn)品的組裝過程躏碳,所以要改變一個(gè)產(chǎn)品的內(nèi)部表示搞旭,只需要再實(shí)現(xiàn)一個(gè)具體的建造者就可以了,從而能很好地應(yīng)對產(chǎn)品部件的需求變化菇绵。

抽象工廠模式解決了“系列產(chǎn)品”的需求變化肄渗,而建造者模式解決的是 “產(chǎn)品部分” 的需要變化。

應(yīng)用場景:

創(chuàng)建復(fù)雜對象的算法應(yīng)該獨(dú)立于該對象的組成部分以及它們的裝配方式時(shí)咬最。建造者模式關(guān)注的是零件類型和裝配工藝(順序)翎嫡。最主要的功能是基本方法的調(diào)用順序安排。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末永乌,一起剝皮案震驚了整個(gè)濱河市惑申,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌翅雏,老刑警劉巖圈驼,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異枚荣,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)啼肩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進(jìn)店門橄妆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來衙伶,“玉大人,你說我怎么就攤上這事害碾∈妇ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵慌随,是天一觀的道長芬沉。 經(jīng)常有香客問我,道長阁猜,這世上最難降的妖魔是什么丸逸? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮剃袍,結(jié)果婚禮上黄刚,老公的妹妹穿的比我還像新娘。我一直安慰自己民效,他們只是感情好憔维,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著畏邢,像睡著了一般业扒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上舒萎,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天程储,我揣著相機(jī)與錄音,去河邊找鬼逆甜。 笑死虱肄,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的交煞。 我是一名探鬼主播咏窿,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼素征!你這毒婦竟也來了集嵌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤御毅,失蹤者是張志新(化名)和其女友劉穎根欧,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體端蛆,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡凤粗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了今豆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嫌拣。...
    茶點(diǎn)故事閱讀 39,745評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡柔袁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出异逐,到底是詐尸還是另有隱情捶索,我是刑警寧澤,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布灰瞻,位于F島的核電站腥例,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏酝润。R本人自食惡果不足惜燎竖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望袍祖。 院中可真熱鬧底瓣,春花似錦、人聲如沸蕉陋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽凳鬓。三九已至茁肠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間缩举,已是汗流浹背垦梆。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留仅孩,地道東北人托猩。 一個(gè)月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像辽慕,于是被迫代替她去往敵國和親京腥。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評論 2 354

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