建造者模式

送分小仙女□ 提交于 2020-04-06 03:43:34

今天复习了下建造者模式,总结下

官方释义:建造者模式(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         }
View Code

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     }
View Code

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         }
View Code
 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     }
View Code

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     }
View Code

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         }
View Code

总结:建造者模式的好处就是使得建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。

参考自<大话设计模式>

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!