深入设计模式(四)——建造者模式

一、建造者模式介绍

  建造者模式(Builder Pattern),将一个复杂对象的构建与它的表示分离,使的同样的构建过程可以创建不同的表示。

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

二、解决实际问题

    主要用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但是对象内部的构建通常面临着复杂的变化。

三、生活中的例子

    建造者模式将复杂对象的构建与对象的表现分离开来,这样使得同样的构建过程可以创建出不同的表现。这种模式用于快餐店制作儿童餐。典型的儿童餐包括一个主食,一个辅 食,一杯饮料和一个玩具(例如汉堡、炸鸡、可乐和玩具车)。这些在不同的儿童餐中可以是不同的,但是组合成儿童餐的过程是相同的。无论顾客点的是汉堡,三 名治还是鸡肉,过程都是一样的。柜台的员工直接把主食,辅食和玩具放在一起。这些是放在一个袋子中的。饮料被倒入杯中,放在袋子外边。这些过程在相互竞争 的餐馆中是同样的。

四、建造者模式分析

  1.建造者结构图

       

      2.代码

        

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace 建造者模式
 8 {
 9    public class Product
10     {
11        private IList<string> parts = new List<string>();
12 
13        public void Add(string part) {
14            parts.Add(part);
15        }
16 
17        public void Show() {
18            Console.WriteLine("产品开始创建.....");
19            foreach (string part in parts)
20            {
21                Console.WriteLine("部件"+part);
22            }
23            Console.WriteLine("产品完成创建");
24        }
25     }
26 }
1、具体产品Product
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace 建造者模式
 8 {
 9    public abstract class Builder
10     {
11        public abstract void BuildPartA();
12        public abstract void BuildPartB();
13        public abstract Product GetResult();
14     }
15 
16 }
2.建造者Builder
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace 建造者模式
 8 {
 9    public class ConcreteBuilder1 : Builder
10     {
11        Product product = new Product();
12         public override void BuildPartA()
13         {
14             product.Add("A1");
15         }
16 
17         public override void BuildPartB()
18         {
19             product.Add("B1");
20         }
21 
22         public override Product GetResult()
23         {
24             return product;
25         }
26     }
27 }
3.具体建造者ConcreteBuilder1
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace 建造者模式
 8 {
 9    public class ConcreteBuilder2:Builder
10     {
11        Product product = new Product();
12         public override void BuildPartA()
13         {
14             product.Add("A2");
15         }
16 
17         public override void BuildPartB()
18         {
19             product.Add("B2");
20         }
21 
22         public override Product GetResult()
23         {
24             return product;
25         }
26     }
27 }
4.具体建造者ConcreteBuilder1
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace 建造者模式
 8 {
 9     /// <summary>
10     /// 指挥建造过程
11     /// </summary>
12    public class Director
13     {
14        public void Construct(Builder builder) {
15            builder.BuildPartA();
16            builder.BuildPartB();
17        }
18     }
19 }
5. 指挥者类Director
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace 建造者模式
 8 {
 9     class Program
10     {
11         static void Main(string[] args)
12         {
13             Director director = new Director();
14             Builder builder1 = new ConcreteBuilder1();
15             Builder builder2 = new ConcreteBuilder2();
16 
17             director.Construct(builder1);
18             Product product1 = builder1.GetResult();
19             product1.Show();
20 
21             director.Construct(builder2);
22             Product product2 = builder2.GetResult();
23             product2.Show();
24             Console.Read();
25         }
26     }
27 }
6.客户端代码
原文地址:https://www.cnblogs.com/xiaowuzi/p/3436495.html