標籤:err 技術分享 ted 品牌 oid 抽象工廠 const rod dir
定義:(Builder Pattern)
將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。
啟示:
採購經理要採購一批台式電腦,為了節約公司成本,決定組裝。但是對於怎麼組裝,採購經理不知道也不關心,所以就指派裝機商組裝。第一次採購的電腦是組裝的HP的台式機,
第二次採購經理決定換個品牌,組裝DELL的台式機。對於怎麼組裝HP、DELL台式機,採購經理不關心。
參與者:
Builder
為建立一個Product對象的各個組件指定抽象介面。
ConcreteBuilder
實現Builder的介面以構造和裝配該產品的各個組件。
定義並明確它所建立的表示。
提供一個檢索產品的介面。
Director
構造一個使用Builder介面的對象。
Product
表示被構造的複雜物件。ConcreteBuilder建立該產品的內部表示並定義它的裝配過程。
包含定義組成組件的類,包括將這些組件裝配成最終產品的介面。 代碼:
先看看產品Product,電腦的實現。
/// <summary> /// 產品類 /// </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> /// 建造者(類比裝機過程),也可通過介面實現 /// Director不關心具體組裝的細節,所以將具體的組裝細節方法標記為protected /// </summary> public abstract class Builder { /// <summary> /// 組裝主機 /// </summary> protected abstract void BuildMainFramePart(); /// <summary> /// 組裝顯示器 /// </summary> protected abstract void BuildScreenPart(); /// <summary> /// 組裝輸入裝置(鍵鼠) /// </summary> protected abstract void BuildInputPart(); /// <summary> /// 擷取組裝電腦 /// 由具體的組裝類決定組裝順序 /// </summary> /// <returns></returns> public abstract Computer BuildComputer(); }
再看看具體的ConcreteBuilder角色,HP電腦組裝商的實現
/// <summary> /// 惠普電腦組裝商 /// </summary> public class HpBulider : Builder { Computer hp = new Computer() { Band = "惠普" }; protected override void BuildMainFramePart() { hp.AssemblePart("主機"); } 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一聲令下,組裝電腦。看看指揮者的實現。
/// <summary> /// 指揮者(採購經理) /// </summary> public class Director { public Computer Construct(Builder builder) { return builder.BuildComputer(); } }優缺點:
建造者隱藏了具體產品的組裝過程,所以要改變一個產品的內部表示,只需要再實現一個具體的建造者就可以了,從而能很好地應對產品組件的需求變化。
抽象原廠模式解決了“系列產品”的需求變化,而建造者模式解決的是 “產品部分” 的需要變化。
應用情境:
建立複雜物件的演算法應該獨立於該對象的組成部分以及它們的裝配方式時。
建造者模式關注的是零件類型和裝配工藝(順序)。最主要的功能是基本方法的調用順序安排。
C#設計模式之創造類模式:建造者模式