知识点回顾
1. 将一个复杂对象的构建与他的表示分离(初始多个成员值并返回这个对象),使得同样的构建过程可以创建不同的表示时,使用建造者模式。
2. 使用建造者模式,用户只需要指定建造的类型就可以得到他们,而具体建造的过程和细节不需要知道,他们被封装在具体的建造类中,扩展具体建造类来丰富建造的特例。
3. 指挥者(Director)类,用来控制建造过程,也用它来隔离用户与建造过程的关联,指挥者类是用户设置并用来创建的工具。
4. 建造者模式和策略模式用到的操作有些相似,指挥者封装的建造方法(在策略模式里面是策略方法)并提供了设置这个指挥者要建造的具体建造类。
5. 上图中,Builder是为类创建Product对象的各个步骤指定的抽象接口,用于为多个具体创建抽象高层。他所定义的是抽象了具体(子类)创建某个对象 比如 Product 的 “外观方法”抽象。
6. ConcreteBuilder 是具体的建造者,实现Builder父类接口,构造和装配特定的各个部件的参数值。Product值的等待装配的对象定义类,就是客户要的对象。
7. Director构建一个使用Builder 的接口,用来提供协调当前要创建的具体对象的操作,通过设置“具体建造类”(Builder的子类),从而创建不同的需求结果。
8. 当创建一个复杂的对象,这些对象内部构造结构是不变的也就是出自一个类,但对象内部的成员内容及构造的顺序多变,可以使用建造者模式。
9. 建造者模式的好处就是使得建造代码(Builder 子类)与表示代码(Director)分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需再定一个具体的建造者就可以了。
10. 建造者模式是在当要创建复杂对象,该对象的组成部分以及他们的装配方式多变时适用的模式
示例代码
using System; using System.Collections.Generic; using System.Text; namespace 建造者模式 { 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(); } } class Director { public void Construct(Builder builder) { //装配步骤 builder.BuildPartA(); builder.BuildPartB(); } } /// <summary> /// 构建类中包含构建步骤及返回构建好的对象 /// </summary> abstract class Builder { public abstract void BuildPartA(); public abstract void BuildPartB(); public abstract Product GetResult(); } class ConcreteBuilder1 : Builder { private Product product = new Product(); public override void BuildPartA() { product.Add("部件A"); } public override void BuildPartB() { product.Add("部件B"); } public override Product GetResult() { return product; } } class ConcreteBuilder2 : Builder { private Product product = new Product(); public override void BuildPartA() { product.Add("部件X"); } public override void BuildPartB() { product.Add("部件Y"); } public override Product GetResult() { return 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); } } } }