建造者模式(Builder Pattern

——.NET设计模式系列之四
Terrylee20051217
概述
在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法确相对稳定。如何应对这种变化?如何提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持系统中的“稳定构建算法”不随着需求改变而改变?这就是要说的建造者模式。
本文通过现实生活中的买KFC的例子,用图解的方式来诠释建造者模式。
意图
将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
模型图
.NET设计模式(4):建造者模式(Builder Pattern)_职场生活中的例子
生成器模式将复杂对象的构建与对象的表现分离开来,这样使得同样的构建过程可以创建出不同的表现。这种模式用于快餐店制作儿童餐。典型的儿童餐包括一个主食,一个辅食,一杯饮料和一个玩具(例如汉堡、炸鸡、可乐和玩具车)。这些在不同的儿童餐中可以是不同的,但是组合成儿童餐的过程是相同的。无论顾客点的是汉堡,三名治还是鸡肉,过程都是一样的。柜台的员工直接把主食,辅食和玩具放在一起。这些是放在一个袋子中的。饮料被倒入杯中,放在袋子外边。这些过程在相互竞争的餐馆中是同样的。
.NET设计模式(4):建造者模式(Builder Pattern)_职场_02实现过程图解
在这里我们还是以去KFC店买套餐为例子,示意图如下:
.NET设计模式(4):建造者模式(Builder Pattern)_.NET_03客户端:顾客。想去买一套套餐(这里面包括汉堡,可乐,薯条),可以有1号和2号两种套餐供顾客选择。
指导者角色:收银员。知道顾客想要买什么样的套餐,并告诉餐馆员工去准备套餐。
建造者角色:餐馆员工。按照收银员的要求去准备具体的套餐,分别放入汉堡,可乐,薯条等。
产品角色:最后的套餐,所有的东西放在同一个盘子里面。
下面开始我们的买套餐过程。
1.客户创建Derector对象,并用它所想要的Builder对象进行配置。顾客进入KFC店要买套餐,先找到一个收银员,相当于创建了一个指导者对象。这位收银员给出两种套餐供顾客选择:1普通套餐,2黄金套餐。完成的工作如时序图中红色部分所示。
.NET设计模式(4):建造者模式(Builder Pattern)_休闲_04程序实现:
 1.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05using System;
 2.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05using System.Configuration;
 3.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05using System.Reflection;
 4.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05
 5.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05namespace KFC
 6.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_10{
 7.NET设计模式(4):建造者模式(Builder Pattern)_.NET_13    /// <summary>
 8.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15    /// Client 类
 9.NET设计模式(4):建造者模式(Builder Pattern)_职场_16    /// </summary>

10.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15    public class Client
11.NET设计模式(4):建造者模式(Builder Pattern)_.NET_18    {
12.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        public static void Main(string[] args)
13.NET设计模式(4):建造者模式(Builder Pattern)_建造者_22        {
14.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15            FoodManager foodmanager = new FoodManager();
15.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15
16.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15            Builder instance;
17.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15
18.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15            Console.WriteLine("Please Enter Food No:");
19.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15
20.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15            string No = Console.ReadLine();
21.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15
22.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15            string foodType = ConfigurationSettings.AppSettings["No"+No];
23.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15
24.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15            instance = (Builder)Assembly.Load("KFC").CreateInstance("KFC." + foodType);
25.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15
26.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15            foodmanager.Construct(instance);
27.NET设计模式(4):建造者模式(Builder Pattern)_职场_16        }

28.NET设计模式(4):建造者模式(Builder Pattern)_职场_16    }

29.NET设计模式(4):建造者模式(Builder Pattern)_职场_40}

30.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05

产品(套餐)类:
 1.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05using System;
 2.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05using System.Collections;
 3.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05
 4.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05namespace KFC
 5.NET设计模式(4):建造者模式(Builder Pattern)_休闲_46{
 6.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_49    /// <summary>
 7.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15    /// Food类,即产品类
 8.NET设计模式(4):建造者模式(Builder Pattern)_职场_16    /// </summary>

 9.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15    public class Food
10.NET设计模式(4):建造者模式(Builder Pattern)_建造者_54    {
11.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        Hashtable food = new Hashtable();
12.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        
13.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_59        /// <summary>
14.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        /// 添加食品
15.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        /// </summary>
16.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        /// <param name="strName">食品名称</param>
17.NET设计模式(4):建造者模式(Builder Pattern)_职场_16        /// <param name="Price">价格</param>

18.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        public void Add(string strName,string Price)
19.NET设计模式(4):建造者模式(Builder Pattern)_休闲_66        {
20.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15            food.Add(strName,Price);
21.NET设计模式(4):建造者模式(Builder Pattern)_职场_16        }

22.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        
23.NET设计模式(4):建造者模式(Builder Pattern)_休闲_72        /// <summary>
24.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        /// 显示食品清单
25.NET设计模式(4):建造者模式(Builder Pattern)_职场_16        /// </summary>

26.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        public void Show()
27.NET设计模式(4):建造者模式(Builder Pattern)_休闲_77        {
28.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15            IDictionaryEnumerator myEnumerator  = food.GetEnumerator();
29.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15            Console.WriteLine("Food List:");
30.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15            Console.WriteLine("------------------------------");
31.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15            string strfoodlist = "";
32.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15            while(myEnumerator.MoveNext())
33.NET设计模式(4):建造者模式(Builder Pattern)_.NET_85            {
34.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15                strfoodlist = strfoodlist + "\n\n" + myEnumerator.Key.ToString();
35.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15                strfoodlist = strfoodlist + ":\t" +myEnumerator.Value.ToString();
36.NET设计模式(4):建造者模式(Builder Pattern)_职场_16            }

37.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15            Console.WriteLine(strfoodlist);
38.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15            Console.WriteLine("\n------------------------------");
39.NET设计模式(4):建造者模式(Builder Pattern)_职场_16        }

40.NET设计模式(4):建造者模式(Builder Pattern)_职场_16    }

41.NET设计模式(4):建造者模式(Builder Pattern)_职场_40}

42.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05
2.指导者通知建造器。收银员(指导者)告知餐馆员工准备套餐。这里我们准备套餐的顺序是:放入汉堡,可乐倒入杯中,薯条放入盒中,并把这些东西都放在盘子上。这个过程对于普通套餐和黄金套餐来说都是一样的,不同的是它们的汉堡,可乐,薯条价格不同而已。如时序图红色部分所示:.NET设计模式(4):建造者模式(Builder Pattern)_.NET_97
程序实现:
 1.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05using System;
 2.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05
 3.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05namespace KFC
 4.NET设计模式(4):建造者模式(Builder Pattern)_休闲_101{
 5.NET设计模式(4):建造者模式(Builder Pattern)_.NET_104    /// <summary>
 6.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15    /// FoodManager类,即指导者
 7.NET设计模式(4):建造者模式(Builder Pattern)_职场_16    /// </summary>

 8.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15    public class FoodManager
 9.NET设计模式(4):建造者模式(Builder Pattern)_.NET_109    {
10.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        public void Construct(Builder builder)
11.NET设计模式(4):建造者模式(Builder Pattern)_职场_113        {
12.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15            builder.BuildHamb();
13.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15
14.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15            builder.BuildCoke();
15.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15
16.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15            builder.BuildChip();
17.NET设计模式(4):建造者模式(Builder Pattern)_职场_16        }
    
18.NET设计模式(4):建造者模式(Builder Pattern)_职场_16    }

19.NET设计模式(4):建造者模式(Builder Pattern)_职场_40}

20.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05
3.建造者处理指导者的要求,并将部件添加到产品中。餐馆员工(建造者)按照收银员要求的把对应的汉堡,可乐,薯条放入盘子中。这部分是建造者模式里面富于变化的部分,因为顾客选择的套餐不同,套餐的组装过程也不同,这步完成产品对象的创建工作。
程序实现:
 1.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05using System;
 2.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05
 3.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05namespace KFC
 4.NET设计模式(4):建造者模式(Builder Pattern)_休闲_128{
 5.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_131    /// <summary>
 6.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15    /// Builder类,即抽象建造者类,构造套餐
 7.NET设计模式(4):建造者模式(Builder Pattern)_职场_16    /// </summary>

 8.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15    public abstract class Builder
 9.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_136    {    
10.NET设计模式(4):建造者模式(Builder Pattern)_休闲_139        /// <summary>
11.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        /// 添加汉堡
12.NET设计模式(4):建造者模式(Builder Pattern)_职场_16        /// </summary>

13.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        public abstract void BuildHamb();
14.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        
15.NET设计模式(4):建造者模式(Builder Pattern)_.NET_145        /// <summary>
16.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        /// 添加可乐
17.NET设计模式(4):建造者模式(Builder Pattern)_职场_16        /// </summary>

18.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        public abstract void BuildCoke();
19.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        
20.NET设计模式(4):建造者模式(Builder Pattern)_休闲_151        /// <summary>
21.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        /// 添加薯条
22.NET设计模式(4):建造者模式(Builder Pattern)_职场_16        /// </summary>

23.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        public abstract void BuildChip();
24.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        
25.NET设计模式(4):建造者模式(Builder Pattern)_建造者_157        /// <summary>
26.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        /// 返回结果
27.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        /// </summary>
28.NET设计模式(4):建造者模式(Builder Pattern)_职场_16        /// <returns>食品对象</returns>

29.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        public abstract Food GetFood();
30.NET设计模式(4):建造者模式(Builder Pattern)_职场_16    }

31.NET设计模式(4):建造者模式(Builder Pattern)_职场_40}

32.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05

 1.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05using System;
 2.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05
 3.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05namespace KFC
 4.NET设计模式(4):建造者模式(Builder Pattern)_休闲_169{
 5.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_172    /// <summary>
 6.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15    /// NormalBuilder类,具体构造者,普通套餐
 7.NET设计模式(4):建造者模式(Builder Pattern)_职场_16    /// </summary>

 8.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15    public class NormalBuilder:Builder
 9.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_177    {
10.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        private Food NormalFood = new Food();
11.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15
12.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        public override void BuildHamb()
13.NET设计模式(4):建造者模式(Builder Pattern)_建造者_183        {
14.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15            NormalFood.Add("NormalHamb","¥10.50");
15.NET设计模式(4):建造者模式(Builder Pattern)_职场_16        }

16.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        
17.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        public override void BuildCoke()
18.NET设计模式(4):建造者模式(Builder Pattern)_职场_190        {
19.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15            NormalFood.Add("CokeCole","¥4.50");
20.NET设计模式(4):建造者模式(Builder Pattern)_职场_16        }

21.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15
22.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        public override void BuildChip()
23.NET设计模式(4):建造者模式(Builder Pattern)_.NET_197        {
24.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15            NormalFood.Add("FireChips","¥2.00");
25.NET设计模式(4):建造者模式(Builder Pattern)_职场_16        }

26.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15
27.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        public override Food GetFood()
28.NET设计模式(4):建造者模式(Builder Pattern)_建造者_204        {
29.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15            return NormalFood;
30.NET设计模式(4):建造者模式(Builder Pattern)_职场_16        }

31.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15
32.NET设计模式(4):建造者模式(Builder Pattern)_职场_16    }

33.NET设计模式(4):建造者模式(Builder Pattern)_职场_40}

34.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05

 1.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05using System;
 2.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05
 3.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05namespace KFC
 4.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_216{
 5.NET设计模式(4):建造者模式(Builder Pattern)_.NET_219    /// <summary>
 6.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15    /// GoldBuilder类,具体构造者,黄金套餐
 7.NET设计模式(4):建造者模式(Builder Pattern)_职场_16    /// </summary>

 8.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15    public class GoldBuilder:Builder
 9.NET设计模式(4):建造者模式(Builder Pattern)_职场_224    {
10.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        private Food GoldFood = new Food();
11.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15
12.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        public override void BuildHamb()
13.NET设计模式(4):建造者模式(Builder Pattern)_职场_230        {
14.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15            GoldFood.Add("GoldHamb","¥13.50");
15.NET设计模式(4):建造者模式(Builder Pattern)_职场_16        }

16.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        
17.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        public override void BuildCoke()
18.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_237        {
19.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15            GoldFood.Add("CokeCole","¥4.50");
20.NET设计模式(4):建造者模式(Builder Pattern)_职场_16        }

21.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15
22.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        public override void BuildChip()
23.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_244        {
24.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15            GoldFood.Add("FireChips","¥3.50");
25.NET设计模式(4):建造者模式(Builder Pattern)_职场_16        }

26.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15
27.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        public override Food GetFood()
28.NET设计模式(4):建造者模式(Builder Pattern)_休闲_251        {
29.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15            return GoldFood;
30.NET设计模式(4):建造者模式(Builder Pattern)_职场_16        }

31.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15
32.NET设计模式(4):建造者模式(Builder Pattern)_职场_16    }

33.NET设计模式(4):建造者模式(Builder Pattern)_职场_40}

34.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05

4.客户从建造者检索产品。从餐馆员工准备好套餐后,顾客再从餐馆员工那儿拿回套餐。这步客户程序要做的仅仅是取回已经生成的产品对象,如时序图中红色部分所示。.NET设计模式(4):建造者模式(Builder Pattern)_休闲_260
完整的客户程序:
 1.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05using System;
 2.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05using System.Configuration;
 3.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05using System.Reflection;
 4.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05
 5.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05namespace KFC
 6.NET设计模式(4):建造者模式(Builder Pattern)_休闲_266{
 7.NET设计模式(4):建造者模式(Builder Pattern)_.NET_13    /// <summary>
 8.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15    /// Client 类
 9.NET设计模式(4):建造者模式(Builder Pattern)_职场_16    /// </summary>

10.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15    public class Client
11.NET设计模式(4):建造者模式(Builder Pattern)_建造者_274    {
12.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        public static void Main(string[] args)
13.NET设计模式(4):建造者模式(Builder Pattern)_建造者_278        {
14.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15            FoodManager foodmanager = new FoodManager();
15.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15
16.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15            Builder instance;
17.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15
18.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15            Console.WriteLine("Please Enter Food No:");
19.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15
20.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15            string No = Console.ReadLine();
21.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15
22.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15            string foodType = ConfigurationSettings.AppSettings["No"+No];
23.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15
24.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15            instance = (Builder)Assembly.Load("KFC").CreateInstance("KFC." + foodType);
25.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15
26.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15            foodmanager.Construct(instance);
27.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15
28.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15            Food food = instance.GetFood();
29.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15            food.Show();
30.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15
31.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15            Console.ReadLine();
32.NET设计模式(4):建造者模式(Builder Pattern)_职场_16        }

33.NET设计模式(4):建造者模式(Builder Pattern)_职场_16    }

34.NET设计模式(4):建造者模式(Builder Pattern)_职场_40}

35.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05
通过分析不难看出,在这个例子中,在准备套餐的过程是稳定的,即按照一定的步骤去做,而套餐的组成部分则是变化的,有可能是普通套餐或黄金套餐等。这个变化就是建造者模式中的“变化点“,就是我们要封装的部分。
另外一个例子
在这里我们再给出另外一个关于建造房子的例子。客户程序通过调用指导者 (CDirector class)BuildHouse()方法来创建一个房子。该方法有一个布尔型的参数blnBackyard,当blnBackyard为假时指导者将创建一个ApartmentConcrete Builder),当它为真时将创建一个Single Family HomeConcrete Builder)。这两种房子都实现了接口Ihouse
程序实现:
  1.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05//关于建造房屋的例子
  2.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05using System;
  3.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05using System.Collections;
  4.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05
  5.NET设计模式(4):建造者模式(Builder Pattern)_.NET_307/// <summary>
  6.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15/// 抽象建造者
  7.NET设计模式(4):建造者模式(Builder Pattern)_职场_40/// </summary>

  8.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05public interface IHouse
  9.NET设计模式(4):建造者模式(Builder Pattern)_建造者_312{
 10.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15    bool GetBackyard();
 11.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15    long NoOfRooms();
 12.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15    string  Description();
 13.NET设计模式(4):建造者模式(Builder Pattern)_职场_40}

 14.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05
 15.NET设计模式(4):建造者模式(Builder Pattern)_建造者_320/// <summary>
 16.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15/// 具体建造者
 17.NET设计模式(4):建造者模式(Builder Pattern)_职场_40/// </summary>

 18.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05public class CApt:IHouse
 19.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_325{
 20.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15    private bool mblnBackyard;
 21.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15    private Hashtable Rooms;
 22.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15    public CApt()
 23.NET设计模式(4):建造者模式(Builder Pattern)_职场_331    {
 24.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        CRoom room;    
 25.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        Rooms = new Hashtable();
 26.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        room = new CRoom();
 27.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        room.RoomName = "Master Bedroom";
 28.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        Rooms.Add ("room1",room);
 29.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15
 30.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        room = new CRoom();
 31.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        room.RoomName = "Second Bedroom";
 32.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        Rooms.Add ("room2",room);
 33.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15
 34.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        room = new CRoom();
 35.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        room.RoomName = "Living Room";
 36.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        Rooms.Add ("room3",room);
 37.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        
 38.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        mblnBackyard = false;
 39.NET设计模式(4):建造者模式(Builder Pattern)_职场_16    }

 40.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15
 41.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15    public bool GetBackyard()
 42.NET设计模式(4):建造者模式(Builder Pattern)_.NET_352    {
 43.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        return mblnBackyard;
 44.NET设计模式(4):建造者模式(Builder Pattern)_职场_16    }

 45.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15    public long NoOfRooms()
 46.NET设计模式(4):建造者模式(Builder Pattern)_休闲_358    {
 47.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        return Rooms.Count; 
 48.NET设计模式(4):建造者模式(Builder Pattern)_职场_16    }

 49.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15    public string  Description()
 50.NET设计模式(4):建造者模式(Builder Pattern)_休闲_364    {
 51.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        IDictionaryEnumerator myEnumerator  = Rooms.GetEnumerator();
 52.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        string strDescription;
 53.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        strDescription = "This is an Apartment with " + Rooms.Count + " Rooms \n";
 54.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        strDescription = strDescription + "This Apartment doesn't have a backyard \n";                        
 55.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        while (myEnumerator.MoveNext())
 56.NET设计模式(4):建造者模式(Builder Pattern)_休闲_372        {
 57.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15            strDescription = strDescription + "\n" + myEnumerator.Key + "\t" + ((CRoom)myEnumerator.Value).RoomName;
 58.NET设计模式(4):建造者模式(Builder Pattern)_职场_16        }

 59.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        return strDescription;
 60.NET设计模式(4):建造者模式(Builder Pattern)_职场_16    }

 61.NET设计模式(4):建造者模式(Builder Pattern)_职场_40}

 62.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05
 63.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_381/// <summary>
 64.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15/// 具体建造者
 65.NET设计模式(4):建造者模式(Builder Pattern)_职场_40/// </summary>

 66.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05public class CSFH:IHouse
 67.NET设计模式(4):建造者模式(Builder Pattern)_建造者_386{
 68.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15    private bool mblnBackyard;
 69.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15    private Hashtable Rooms;
 70.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15    public CSFH()
 71.NET设计模式(4):建造者模式(Builder Pattern)_.NET_392    {
 72.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        CRoom room;
 73.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        Rooms = new Hashtable();
 74.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15
 75.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        room = new CRoom();
 76.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        room.RoomName = "Master Bedroom";
 77.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        Rooms.Add ("room1",room);
 78.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15
 79.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        room = new CRoom();
 80.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        room.RoomName = "Second Bedroom";
 81.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        Rooms.Add ("room2",room);
 82.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15
 83.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        room = new CRoom();
 84.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        room.RoomName = "Third Room";
 85.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        Rooms.Add ("room3",room);
 86.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        
 87.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        room = new CRoom();
 88.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        room.RoomName = "Living Room";
 89.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        Rooms.Add ("room4",room);
 90.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15
 91.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        room = new CRoom();
 92.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        room.RoomName = "Guest Room";
 93.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        Rooms.Add ("room5",room);
 94.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15
 95.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        mblnBackyard = true;
 96.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15 
 97.NET设计模式(4):建造者模式(Builder Pattern)_职场_16    }

 98.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15
 99.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15    public bool GetBackyard()
100.NET设计模式(4):建造者模式(Builder Pattern)_休闲_423    {
101.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        return mblnBackyard;
102.NET设计模式(4):建造者模式(Builder Pattern)_职场_16    }

103.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15    public long NoOfRooms()
104.NET设计模式(4):建造者模式(Builder Pattern)_建造者_429    {
105.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        return Rooms.Count;
106.NET设计模式(4):建造者模式(Builder Pattern)_职场_16    }

107.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15    public string  Description()
108.NET设计模式(4):建造者模式(Builder Pattern)_职场_435    {
109.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        IDictionaryEnumerator myEnumerator  = Rooms.GetEnumerator();
110.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        string strDescription;
111.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        strDescription = "This is an Single Family Home with " + Rooms.Count + " Rooms \n";
112.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        strDescription = strDescription + "This house has a backyard \n"
113.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        while (myEnumerator.MoveNext())
114.NET设计模式(4):建造者模式(Builder Pattern)_休闲_443        {
115.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15            strDescription = strDescription + "\n" + myEnumerator.Key + "\t" + ((CRoom)myEnumerator.Value).RoomName; 
116.NET设计模式(4):建造者模式(Builder Pattern)_职场_16        }
      
117.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        return strDescription;
118.NET设计模式(4):建造者模式(Builder Pattern)_职场_16    }

119.NET设计模式(4):建造者模式(Builder Pattern)_职场_40}

120.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05
121.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05public interface IRoom
122.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_453{
123.NET设计模式(4):建造者模式(Builder Pattern)_休闲_456    string RoomName{get;set;}
124.NET设计模式(4):建造者模式(Builder Pattern)_职场_40}

125.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05
126.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05public class CRoom:IRoom
127.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_462{
128.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15    private string mstrRoomName;
129.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15    public string RoomName
130.NET设计模式(4):建造者模式(Builder Pattern)_建造者_467    {
131.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        get
132.NET设计模式(4):建造者模式(Builder Pattern)_建造者_471        {
133.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15            return mstrRoomName;
134.NET设计模式(4):建造者模式(Builder Pattern)_职场_16        }

135.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        set 
136.NET设计模式(4):建造者模式(Builder Pattern)_建造者_477        {
137.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15            mstrRoomName = value;
138.NET设计模式(4):建造者模式(Builder Pattern)_职场_16        }

139.NET设计模式(4):建造者模式(Builder Pattern)_职场_16    }

140.NET设计模式(4):建造者模式(Builder Pattern)_职场_40}

141.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05
142.NET设计模式(4):建造者模式(Builder Pattern)_建造者_485/// <summary>
143.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15/// 指导者
144.NET设计模式(4):建造者模式(Builder Pattern)_职场_40/// </summary>

145.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05public class CDirector
146.NET设计模式(4):建造者模式(Builder Pattern)_职场_490{
147.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15    public IHouse BuildHouse(bool blnBackyard)
148.NET设计模式(4):建造者模式(Builder Pattern)_.NET_494    {
149.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        if (blnBackyard)
150.NET设计模式(4):建造者模式(Builder Pattern)_.NET_498        {
151.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15            return new CSFH();
152.NET设计模式(4):建造者模式(Builder Pattern)_职场_16        }

153.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        else
154.NET设计模式(4):建造者模式(Builder Pattern)_休闲_504        {
155.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15            return new CApt(); 
156.NET设计模式(4):建造者模式(Builder Pattern)_职场_16        }

157.NET设计模式(4):建造者模式(Builder Pattern)_职场_16    }

158.NET设计模式(4):建造者模式(Builder Pattern)_职场_40}

159.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05
160.NET设计模式(4):建造者模式(Builder Pattern)_休闲_512/// <summary>
161.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15/// 客户程序
162.NET设计模式(4):建造者模式(Builder Pattern)_职场_40/// </summary>

163.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05public class Client
164.NET设计模式(4):建造者模式(Builder Pattern)_休闲_517{
165.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15    static void Main(string[] args) 
166.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_521    {
167.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        CDirector objDirector = new CDirector();
168.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        IHouse objHouse;
169.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15
170.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        string Input = Console.ReadLine();
171.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        objHouse = objDirector.BuildHouse(bool.Parse(Input));
172.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15    
173.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        Console.WriteLine(objHouse.Description());
174.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15        Console.ReadLine();
175.NET设计模式(4):建造者模式(Builder Pattern)_职场_16    }

176.NET设计模式(4):建造者模式(Builder Pattern)_职场_40}

177.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05
178.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05
建造者模式的几种演化
省略抽象建造者角色
系统中只需要一个具体建造者,省略掉抽象建造者,结构图如下:
.NET设计模式(4):建造者模式(Builder Pattern)_建造者_536指导者代码如下:
 1.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05 class Director
 2.NET设计模式(4):建造者模式(Builder Pattern)_.NET_538  {
 3.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15   private ConcreteBuilder builder;
 4.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15 
 5.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15   public void Construct()
 6.NET设计模式(4):建造者模式(Builder Pattern)_职场_544    {
 7.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15     builder.BuildPartA();
 8.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15     builder.BuildPartB();
 9.NET设计模式(4):建造者模式(Builder Pattern)_职场_16   }

10.NET设计模式(4):建造者模式(Builder Pattern)_职场_40 }
省略指导者角色
抽象建造者角色已经被省略掉,还可以省略掉指导者角色。让Builder角色自己扮演指导者与建造者双重角色。结构图如下:
.NET设计模式(4):建造者模式(Builder Pattern)_休闲_551建造者角色代码如下:
 1.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05 public class Builder
 2.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_553  {
 3.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15   private Product product = new Product();
 4.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15 
 5.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15   public void BuildPartA()
 6.NET设计模式(4):建造者模式(Builder Pattern)_建造者_559    
 7.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15     //.NET设计模式(4):建造者模式(Builder Pattern)_职场_12.NET设计模式(4):建造者模式(Builder Pattern)_职场_12
 8.NET设计模式(4):建造者模式(Builder Pattern)_职场_16   }

 9.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15 
10.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15   public void BuildPartB()
11.NET设计模式(4):建造者模式(Builder Pattern)_休闲_568    {
12.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15     //.NET设计模式(4):建造者模式(Builder Pattern)_职场_12.NET设计模式(4):建造者模式(Builder Pattern)_职场_12
13.NET设计模式(4):建造者模式(Builder Pattern)_职场_16   }

14.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15 
15.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15   public Product GetResult()
16.NET设计模式(4):建造者模式(Builder Pattern)_休闲_577    {
17.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15     return product;
18.NET设计模式(4):建造者模式(Builder Pattern)_职场_16   }

19.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15 
20.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15   public void Construct()
21.NET设计模式(4):建造者模式(Builder Pattern)_.NET_584    {
22.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15     BuildPartA();
23.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15     BuildPartB();
24.NET设计模式(4):建造者模式(Builder Pattern)_职场_16   }

25.NET设计模式(4):建造者模式(Builder Pattern)_职场_40 }

客户程序:
 1.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_05 public class Client
 2.NET设计模式(4):建造者模式(Builder Pattern)_.NET设计模式系列_592  {
 3.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15   private static Builder builder;
 4.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15 
 5.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15   public static void Main()
 6.NET设计模式(4):建造者模式(Builder Pattern)_建造者_598    {
 7.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15     builder = new Builder();
 8.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15     builder.Construct();
 9.NET设计模式(4):建造者模式(Builder Pattern)_.NET_15     Product product = builder.GetResult();
10.NET设计模式(4):建造者模式(Builder Pattern)_职场_16   }

11.NET设计模式(4):建造者模式(Builder Pattern)_职场_40 }

合并建造者角色和产品角色
建造模式失去抽象建造者角色和指导者角色后,可以进一步退化,从而失去具体建造者角色,此时具体建造者角色和产品角色合并,从而使得产品自己就是自己的建造者。这样做混淆了对象的建造者和对象本身,但是有时候一个产品对象有着固定的几个零件,而且永远只有这几个零件,此时将产品类和建造类合并,可以使系统简单易读。结构图如下:
.NET设计模式(4):建造者模式(Builder Pattern)_建造者_606实现要点
1、建造者模式主要用于“分步骤构建一个复杂的对象”,在这其中“分步骤”是一个稳定的算法,而复杂对象的各个部分则经常变化。
2产品不需要抽象类,特别是由于创建对象的算法复杂而导致使用此模式的情况下或者此模式应用于产品的生成过程,其最终结果可能差异很大,不大可能提炼出一个抽象产品类。
3
、创建者中的创建子部件的接口方法不是抽象方法而是空方法,不进行任何操作,具体的创建者只需要覆盖需要的方法就可以,但是这也不是绝对的,特别是类似文本转换这种情况下,缺省的方法将输入原封不动的输出是合理的缺省操作。
4、前面我们说过的抽象工厂模式(Abtract Factory)解决“系列对象”的需求变化,Builder模式解决“对象部分”的需求变化,建造者模式常和组合模式(Composite Pattern)结合使用。
效果
1、建造者模式的使用使得产品的内部表象可以独立的变化。使用建造者模式可以使客户端不必知道产品内部组成的细节。
2
、每一个Builder都相对独立,而与其它的Builder无关。
3
、可使对构造过程更加精细控制。
4、将构建代码和表示代码分开。
5、建造者模式的缺点在于难于应付“分步骤构建算法”的需求变动。
适用性
以下情况应当使用建造者模式:
1、需要生成的产品对象有复杂的内部结构。
2
、需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序。
3
 在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到。
应用场景
1、   RTF文档交换格式阅读器。
2、   .NET环境下的字符串处理StringBuilder,这是一种简化了的建造者模式。
3、   ……
总结
建造者模式的实质是解耦组装过程和创建具体部件,使得我们不用去关心每个部件是如何组装的。
______________________________________________________________________________________
参考资料:
Java与设计模式》阎宏
《设计模式(中文版)》
DesignPatternsExplained