1、概念
將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。
2、角色
產品(Product)——根據不同建造者建造的結果;
抽象建造者(Builder)——包含詳細的建造步驟;
指揮者(Director)——安排如何建造,如何安排步驟的先後順序;
具體的建造者——根據不同的需求,實現Builder的步驟,每一步驟如何?是不同的,但是Builder中的所有步驟必須都要有。
3、模型
各角色的實現
using System;using System.Collections.Generic;using System.Text;namespace BuilderPattern{ public class Product//產品 { List<string> parts = new List<string>(); public void Add(string part) { parts.Add(part); } public void ShowProductStep() { Console.WriteLine(@"開始建立產品:"); foreach (string part in parts) { Console.WriteLine(part); } } } public abstract class Builder//抽象建造者 { public abstract void BuilderStep1(); public abstract void BuilderStep2(); public abstract void BuilderStep3(); // ... 根據不同的需求,該產品生產時所需的所有步驟。 public abstract Product GetProduct(); } public class ProductBuilder1 : Builder//具體建造者1 { private Product product = new Product(); public override void BuilderStep1() { product.Add("第一步 -- "); } public override void BuilderStep2() { product.Add("第二步 -- "); } public override void BuilderStep3() { product.Add("第三步"); } public override Product GetProduct() { return product; } } public class ProductBuilder2 : Builder//具體建造者2,具體建造者的具體步驟是不同的,但是有哪些步驟,這是統一的。 { private Product product = new Product(); public override void BuilderStep1() { product.Add("第1步 -- "); } public override void BuilderStep2() { product.Add("第2步 -- "); } public override void BuilderStep3() { product.Add("第3步"); } public override Product GetProduct() { return product; } } public class Derector//指揮者 { public void Construct(Builder builder) { builder.BuilderStep1(); builder.BuilderStep2(); builder.BuilderStep3(); } }}
用戶端調用
using System;using System.Collections.Generic;using System.Text; namespace BuilderPattern{ class Program { static void Main(string[] args) { Derector derector = new Derector(); Builder builder1 = new ProductBuilder1(); Builder builder2 = new ProductBuilder2(); //建造產品1 derector.Construct(builder1); Product product1 = builder1.GetProduct(); product1.ShowProductStep(); //建造產品2 derector.Construct(builder2); Product product2 = builder2.GetProduct(); product2.ShowProductStep(); Console.ReadKey(); } }}
結果
建造者模式強調的是步驟,就是得到的結果必須保證產生這個結果的流程都是統一的,而且也是的演算法和表示分離,這一點類似於策略模式,不同的演算法來實現這個策略。但是建造者模式更強調的是步驟。同時從指揮者這部分看又有些類似於面板模式,定義一個高層介面使子系統更加容易使用。但是建造者模式中,這部分的特點是指揮者決定步驟的順序,它指揮如何建造,而且經過它指揮的產生的結果在流程上是一樣的。