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(); } } }
结果
建造者模式强调的是步骤,就是得到的结果必须保证产生这个结果的流程都是统一的,而且也是的算法和表示分离,这一点类似于策略模式,不同的算法来实现这个策略。但是建造者模式更强调的是步骤。同时从指挥者这部分看又有些类似于外观模式,定义一个高层接口使子系统更加容易使用。但是建造者模式中,这部分的特点是指挥者决定步骤的顺序,它指挥如何建造,而且经过它指挥的产生的结果在流程上是一样的。