將一個複雜的構建與其表示相分離,使得一樣的構建過程能夠建立不一樣的表示,這就是建造者模式。ide
簡單的說就是生產一個產品的步驟比較穩定,單個步驟變化會產生一個不一樣的產品。ui
物理模型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(); } }
客戶端不瞭解具體的製做過程,產品的細節制做被封裝隔離,買個汽車,能夠關心汽車的各個部件是否是好的,可是不必知道這個東西怎麼建造的。
產品的部分建造能夠靈活控制,配料的多少能夠製做出不一樣的產品,若是步驟細分還能夠出更多產品,如面料多少能夠分大碗 小碗 中碗。