今天复习了下建造者模式,总结下
官方释义:建造者模式(Builder),将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示
对于复杂对象的创建,如果其创建过程是稳定的,但内部表现却有不同形式(比如,建造一个人,都有头、身体、左臂右臂、左腿右腿四部分,但表现形式却不同:瘦人、胖人、高人、矮人等),这就可以考虑使用建造模式:将建造过程抽象出来,具体建造过程基于抽象的建造过程就不会丢掉某一建造步骤,而客户端只需调用指挥者类、传入具体表现形式(瘦人、胖人、高人...),至于具体的建造细节客户端无需关注:你要胖人,我返回给你胖人,要瘦人我返回给你具体的瘦人,怎样造的?你不会关心
事例代码:
1.产品类:即要构建的具体产品

1 /// <summary>
2 /// 产品类
3 /// </summary>
4 class Product
5 {
6 //产品的多个部件
7 IList<string> parts = new List<string>();
8
9 //添加产品部件方法
10 public void Add(string part)
11 {
12 parts.Add(part);
13 }
14
15 /// <summary>
16 /// 展示产品部件
17 /// </summary>
18 public void Display()
19 {
20 foreach (string part in parts)
21 {
22 Console.WriteLine(part);
23 }
24 }
2.抽象构建者类:定义好具体构建过程

1 /// <summary>
2 /// 抽象建造类:控制建造过程(避免丢掉建造步骤)
3 /// </summary>
4 abstract class Builder
5 {
6 //假定该建造过程分两步:A,B
7 public abstract void BuildPartA();
8 public abstract void BuildPartB();
9 //建造完成,得到产品
10 public abstract Product GetProduct();
11 }
3.具体构建者:继承自抽象构建者,保证了构建过程的稳定

1 /// <summary>
2 /// 具体建造者1
3 /// </summary>
4 class ConcreteBuilder1:Builder
5 {
6 Product product = new Product();
7
8 public override void BuildPartA()
9 {
10 product.Add("部件A");
11 }
12
13 public override void BuildPartB()
14 {
15 product.Add("部件B");
16 }
17
18 public override Product GetProduct()
19 {
20 return product;
21 }

1 /// <summary>
2 /// 具体建造者2
3 /// </summary>
4 class ConcreteBuilder2 : Builder
5 {
6 Product product = new Product();
7
8 public override void BuildPartA()
9 {
10 product.Add("部件X");
11 }
12
13 public override void BuildPartB()
14 {
15 product.Add("部件Y");
16 }
17
18 public override Product GetProduct()
19 {
20 return product;
21 }
22 }
4.很重要的类:指挥者类,客户端直接引用,根据客户的意图创建具体产品

1 /// <summary>
2 /// 指挥者类:根据用户需求,建造不同产品(过程是稳定的,都是A,B两步)
3 /// </summary>
4 class Director
5 {
6 public void Build(Builder builder)
7 {
8 builder.BuildPartA();
9 builder.BuildPartB();
10 }
11 }
5.客户端调用:

1 static void Main(string[] args)
2 {
3 //创建指挥者
4 Director director = new Director();
5 Builder concreteBuilder1=new ConcreteBuilder1();
6 Builder concreteBuilder2 = new ConcreteBuilder2();
7
8 //指挥创建具体产品1
9 director.Build(concreteBuilder1);
10 Product p1 = concreteBuilder1.GetProduct();
11 p1.Display();
12
13 //指挥创建具体产品2
14 director.Build(concreteBuilder2);
15 Product p2 = concreteBuilder2.GetProduct();
16 p2.Display();
17
18 Console.Read();
19 }
总结:建造者模式的好处就是使得建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。
参考自<大话设计模式>
来源:https://www.cnblogs.com/baweier2013/p/5011469.html
