當需要將一個複雜的對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示,就可以使用建造者模式。 在建造者模式中,用戶只需要指定需要建造的類型就可以得到它們,而建造的具體過程和細節是不需要知道的。 下麵使用建造小人,舉例說明該模式: 首先創建不同的建造者: 然後,定義指揮者,該指揮者定義了建 ...
當需要將一個複雜的對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示,就可以使用建造者模式。 在建造者模式中,用戶只需要指定需要建造的類型就可以得到它們,而建造的具體過程和細節是不需要知道的。
下麵使用建造小人,舉例說明該模式:
首先創建不同的建造者:
/// <summary> /// 建造者的介面,定義了建造某個對象需要的部分 /// </summary> public interface IPersonBuilder { void BuildHead(); void BuildBody(); void BuildArm(); void BuildLeg(); } /// <summary> /// 具體的建造者,繼承建造者介面,實現了每個部分的細節 /// </summary> public class TallPersonBuilder : IPersonBuilder { public void BuildHead() { Console.WriteLine("Build Tall Person Head"); } public void BuildBody() { Console.WriteLine("Build Tall Build Body"); } public void BuildArm() { Console.WriteLine("Build Tall Build Arm"); } public void BuildLeg() { Console.WriteLine("Build Tall Build Leg"); } } public class SmallPersonBuilder : IPersonBuilder { public void BuildHead() { Console.WriteLine("Build Small Person Head"); } public void BuildBody() { Console.WriteLine("Build Small Build Body"); } public void BuildArm() { Console.WriteLine("Build Small Build Arm"); } public void BuildLeg() { Console.WriteLine("Build Small Build Leg"); } }
然後,定義指揮者,該指揮者定義了建造的步驟,但不包含具體的實現:
/// <summary> /// 指揮者類,詳細定義了建造的過程,隔離用戶與建造過程的關聯 /// </summary> public class PersonDirector { private IPersonBuilder personBuilder; public PersonDirector(IPersonBuilder personBuilder) { this.personBuilder = personBuilder; } public void CreatePerson() { personBuilder.BuildHead(); personBuilder.BuildBody(); personBuilder.BuildArm(); personBuilder.BuildLeg(); } }
客戶端使用指揮者和某個具體的建造者,得到需要的對象:
SmallPersonBuilder sb = new SmallPersonBuilder(); PersonDirector director1 = new PersonDirector(sb); director1.CreatePerson(); TallPersonBuilder tb = new TallPersonBuilder(); PersonDirector director2 = new PersonDirector(tb); director2.CreatePerson();
建造者模式主要是用於創建一些複雜的對象,這些對象內部構件的建造順序通常是穩定的,但內部構件的實現面臨著複雜的變化。它的好處是使得建造代碼與實現代碼分離,建造者隱藏了產品是如何組裝的,所以若需要改變一個產品的內部實現,只需要改變具體的建造者就可以了。因此建造者模式是在當創建複雜對象的演算法應該獨立於該對象的組成部分以及它們的裝配方式時適用的模式。