今天复习了下建造者模式,总结下
官方释义:建造者模式(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