建造者模式
c#
當須要將一個複雜的對象與它的表示分離,使得一樣的構建過程能夠建立不一樣的表示時,能夠使用建造者模式.若是使用建造者模式,用戶只需指定須要構建的類型便可,具體建造的過程和細節就不需知道了.設計模式
模式組成(代碼引用與《大話設計模式》)ide
1)Buider-抽象建造者類,是爲建立一個Product對象的各個部件指定的抽象接口.示例代碼以下:ui
abstract class Builder { public abstract void BuilderPartA(); public abstract void BuilderPartB(); public abstract Product GetResult(); }
2)ConcreteBuilder-具體建造者類,是具體建造者,實現Builder接口,構造和裝配各個部件.示例代碼以下:
spa
class ConcreteBuilder1:Builder { private Product product = new Product(); public override void BuilderPartA() { product.Add("部件A"); } public override void BuilderPartB() { product.Add("部件B"); } public override Product GetResult() { return product; } }
class ConcreteBuilder2:Builder { private Product product = new Product(); public override void BuilderPartA() { product.Add("部件X"); } public override void BuilderPartB() { product.Add("部件Y"); } public override Product GetResult() { return product; } }
3)Product類-產品類,指具體的產品.代碼以下:
設計
class Product { IList<string> parts = new List<string>(); public void Add(string part) { parts.Add(part); } public void Show() { Console.WriteLine("\n產品 創建----"); foreach (string part in parts) { Console.WriteLine(part); } } }
4)Director-指揮者類,是構建一個使用Builder接口的對象.代碼以下:
code
class Director { public void Construct(Builder builder) { builder.BuilderPartA(); builder.BuilderPartB(); } }
5)客戶端代碼以下:
對象
class Program { static void Main(string[] args) { Director director = new Director(); Builder b1 = new ConcreteBuilder1(); Builder b2 = new ConcreteBuilder2(); director.Construct(b1); Product p1 = b1.GetResult(); p1.Show(); director.Construct(b2); Product p2 = b2.GetResult(); p2.Show(); Console.Read(); } }
3. 適用狀況及使用好處接口
當建立一些複雜的對象,這些對象內部構建間的建造順序一般是穩定的,但對象內部的構建一般面臨着複雜的變化.
string
建造者模式的好處是使得建造代碼與表示代碼分離,因爲建造者隱藏了該產品是如何組裝的,因此若須要改變一個產品的內部表示,只須要再定義一個具體的建造者就能夠了.