[設計模式]第四回:建造者模式(Builder Pattern)

1.概述

將一個複雜的構建與其表示相分離,使得一樣的構建過程能夠建立不一樣的表示,這就是建造者模式。ide

簡單的說就是生產一個產品的步驟比較穩定,單個步驟變化會產生一個不一樣的產品。ui

2.實踐

物理模型spa

建造者模式的例子不少,如肯德基套餐,遊戲角色人物等等。前一段時間同事辭職去開了一家米線店,開張時咱們這些同事都去捧場了,免費午飯,隨咱們點,菜單發現並很少,只有幾種類型的米線,酸辣米線,雜醬米線。code

談話中米線作法,他說至關簡單,一開始慢慢試,調出味道,成熟後而後把各個配料的量紀錄下來,這樣就成爲一道米線了,下次直接按照配料量一一加入 便可,各類配料都在這了,就這麼多,只是每種配料的量不一樣,配出不同的米線。blog

先定義一個米線產品,成品米線由好多部分組成的接口

    /// <summary>
    /// 米線產品
    /// </summary>
    public class NoodlesProduct
    {
        List<string> parts = new List<string>();

        public void AddPart(string part)
        {
            parts.Add(part);
        }
        /// <summary>
        /// 展現 米線產品
        /// </summary>
        public void Show()
        {
            foreach (var p in parts)
            {
                Console.WriteLine(p);
            }
        }
    }

接下來就要開始作米線了,米線作的過程都差很少,只是放料多少有所不一樣,先抽象一個作米線的接口以下:遊戲

    /// <summary>
    /// 建造者:這裏是用來作米線,假設米線由下面3個部分組成
    /// </summary>
    public interface IBuilder
    {
        /// <summary>
        /// 米線主料
        /// </summary>
        void BuilderNoodles();
        /// <summary>
        /// 酸辣料
        /// </summary>
        void BuilderHotSour();
        /// <summary>
        /// 肉醬料
        /// </summary>
        void BuiderMeat();
        /// <summary>
        /// 獲取成功的米線產品
        /// </summary>
        NoodlesProduct GetNoodles();
    }

來個具體的實現,作個酸辣米線string

/// <summary>
    /// 酸辣米線製做類
    /// </summary>
    public class BuilderHotSour : IBuilder
    {
        NoodlesProduct noodles = new NoodlesProduct();
        /// <summary>
        /// 主料
        /// </summary>
        public void BuilderNoodles()
        {
            noodles.AddPart("加入米線及油鹽味精");
        }
        /// <summary>
        /// 放酸辣
        /// </summary>
        public void BuilderHotSour()
        {
            noodles.AddPart("加入適量辣椒及醋");
        }
        /// <summary>
        /// 肉醬料
        /// </summary>
        public void BuiderMeat()
        {
            noodles.AddPart("加入少許肉醬");
        }
        public NoodlesProduct GetNoodles()
        {
            return noodles;
        }
    }

再來個肉醬米線,相似產品

    /// <summary>
    /// 肉醬米線製做類
    /// </summary>
    public class BuilderMeat : IBuilder
    {
        NoodlesProduct noodles = new NoodlesProduct();
        /// <summary>
        /// 主料
        /// </summary>
        public void BuilderNoodles()
        {
            noodles.AddPart("加入米線及油鹽味精");
        }
        /// <summary>
        /// 放酸辣
        /// </summary>
        public void BuilderHotSour()
        {
            noodles.AddPart("加入微量辣椒及醋或者不加");
        }
        /// <summary>
        /// 肉醬料
        /// </summary>
        public void BuiderMeat()
        {
            noodles.AddPart("加入適量肉醬");
        }
        public NoodlesProduct GetNoodles()
        {
            return noodles;
        }
    }

接下來就是開始客戶點餐要告訴客服或者廚師 要什麼米線了,作米線都是他們來控制的,他們是一個指導者的角色it

    /// <summary>
    /// 指揮者(前臺/或者廚師)
    /// </summary>
    public class Director
    {
        public void Construct(IBuilder builder)
        {
            builder.BuilderNoodles();
            builder.BuilderHotSour();
            builder.BuiderMeat();
        }
    }

用戶點餐過程以下:

    public class MainClient
    {
        public void Main()
        {
            //客服人員
            Director director = new Director();
            //用戶點餐是  酸辣米線
            IBuilder builder = new BuilderHotSour();
            //客服人員告訴廚師開始作米線
            director.Construct(builder);
            //米線 作好
            NoodlesProduct nooodels = builder.GetNoodles();
            //用戶獲得米線,可驗證米線是否少了料
            nooodels.Show();
        }
    }

 

3.小結

客戶端不瞭解具體的製做過程,產品的細節制做被封裝隔離,買個汽車,能夠關心汽車的各個部件是否是好的,可是不必知道這個東西怎麼建造的。

產品的部分建造能夠靈活控制,配料的多少能夠製做出不一樣的產品,若是步驟細分還能夠出更多產品,如面料多少能夠分大碗 小碗 中碗。

相關文章
相關標籤/搜索