建造者模式(Builder Pattern)

概述

在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法确相对稳定。如何应对这种变化?如何提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持系统中的“稳定构建算法”不随着需求改变而改变?这就是要说的建造者模式。

本文通过现实生活中的买KFC的例子,用图解的方式来诠释建造者模式。

意图

将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

模型图

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

生活中的例子

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

.NET设计模式(4):建造者模式(Builder Pattern)_时序图_02

实现过程图解

在这里我们还是以去KFC店买套餐为例子,示意图如下:

.NET设计模式(4):建造者模式(Builder Pattern)_封装_03

客户端:顾客。想去买一套套餐(这里面包括汉堡,可乐,薯条),可以有1号和2号两种套餐供顾客选择。

指导者角色:收银员。知道顾客想要买什么样的套餐,并告诉餐馆员工去准备套餐。

建造者角色:餐馆员工。按照收银员的要求去准备具体的套餐,分别放入汉堡,可乐,薯条等。

产品角色:最后的套餐,所有的东西放在同一个盘子里面。

下面开始我们的买套餐过程。

1.客户创建Derector对象,并用它所想要的Builder对象进行配置。顾客进入KFC店要买套餐,先找到一个收银员,相当于创建了一个指导者对象。这位收银员给出两种套餐供顾客选择:1普通套餐,2黄金套餐。完成的工作如时序图中红色部分所示。

.NET设计模式(4):建造者模式(Builder Pattern)_时序图_04

程序实现:


 1.NET设计模式(4):建造者模式(Builder Pattern)_建造者_05using System;

 2.NET设计模式(4):建造者模式(Builder Pattern)_时序图_06using System.Configuration;

 3.NET设计模式(4):建造者模式(Builder Pattern)_封装_07using System.Reflection;

 4.NET设计模式(4):建造者模式(Builder Pattern)_封装_08

 5.NET设计模式(4):建造者模式(Builder Pattern)_时序图_09namespace KFC

 6.NET设计模式(4):建造者模式(Builder Pattern)_封装_10.NET设计模式(4):建造者模式(Builder Pattern)_ide_11{

 7.NET设计模式(4):建造者模式(Builder Pattern)_时序图_12.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_13    /// <summary>

 8.NET设计模式(4):建造者模式(Builder Pattern)_ide_14    /// Client 类

 9.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_15    /// </summary>

10.NET设计模式(4):建造者模式(Builder Pattern)_建造者_16    public class Client

11.NET设计模式(4):建造者模式(Builder Pattern)_时序图_17.NET设计模式(4):建造者模式(Builder Pattern)_ide_18    {

12.NET设计模式(4):建造者模式(Builder Pattern)_时序图_19        public static void Main(string[] args)

13.NET设计模式(4):建造者模式(Builder Pattern)_封装_20.NET设计模式(4):建造者模式(Builder Pattern)_封装_21        {

14.NET设计模式(4):建造者模式(Builder Pattern)_封装_22            FoodManager foodmanager = new FoodManager();

15.NET设计模式(4):建造者模式(Builder Pattern)_ide_23

16.NET设计模式(4):建造者模式(Builder Pattern)_ide_24            Builder instance;

17.NET设计模式(4):建造者模式(Builder Pattern)_ide_25

18.NET设计模式(4):建造者模式(Builder Pattern)_ide_26            Console.WriteLine("Please Enter Food No:");

19.NET设计模式(4):建造者模式(Builder Pattern)_封装_27

20.NET设计模式(4):建造者模式(Builder Pattern)_ide_28            string No = Console.ReadLine();

21.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_29

22.NET设计模式(4):建造者模式(Builder Pattern)_ide_30            string foodType = ConfigurationSettings.AppSettings["No"+No];

23.NET设计模式(4):建造者模式(Builder Pattern)_ide_31

24.NET设计模式(4):建造者模式(Builder Pattern)_时序图_32            instance = (Builder)Assembly.Load("KFC").CreateInstance("KFC." + foodType);

25.NET设计模式(4):建造者模式(Builder Pattern)_建造者_33

26.NET设计模式(4):建造者模式(Builder Pattern)_封装_34            foodmanager.Construct(instance);

27.NET设计模式(4):建造者模式(Builder Pattern)_时序图_35        }

28.NET设计模式(4):建造者模式(Builder Pattern)_时序图_36    }

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

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


产品(套餐)类:

 1.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_39using System;

 2.NET设计模式(4):建造者模式(Builder Pattern)_ide_40using System.Collections;

 3.NET设计模式(4):建造者模式(Builder Pattern)_建造者_41

 4.NET设计模式(4):建造者模式(Builder Pattern)_建造者_42namespace KFC

 5.NET设计模式(4):建造者模式(Builder Pattern)_封装_43.NET设计模式(4):建造者模式(Builder Pattern)_封装_44{

 6.NET设计模式(4):建造者模式(Builder Pattern)_封装_45.NET设计模式(4):建造者模式(Builder Pattern)_建造者_46    /// <summary>

 7.NET设计模式(4):建造者模式(Builder Pattern)_封装_47    /// Food类,即产品类

 8.NET设计模式(4):建造者模式(Builder Pattern)_ide_48    /// </summary>

 9.NET设计模式(4):建造者模式(Builder Pattern)_建造者_49    public class Food

10.NET设计模式(4):建造者模式(Builder Pattern)_封装_50.NET设计模式(4):建造者模式(Builder Pattern)_封装_51    {

11.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_52        Hashtable food = new Hashtable();

12.NET设计模式(4):建造者模式(Builder Pattern)_ide_53        

13.NET设计模式(4):建造者模式(Builder Pattern)_建造者_54.NET设计模式(4):建造者模式(Builder Pattern)_封装_55        /// <summary>

14.NET设计模式(4):建造者模式(Builder Pattern)_ide_56        /// 添加食品

15.NET设计模式(4):建造者模式(Builder Pattern)_封装_57        /// </summary>

16.NET设计模式(4):建造者模式(Builder Pattern)_时序图_58        /// <param name="strName">食品名称</param>

17.NET设计模式(4):建造者模式(Builder Pattern)_封装_59        /// <param name="Price">价格</param>

18.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_60        public void Add(string strName,string Price)

19.NET设计模式(4):建造者模式(Builder Pattern)_ide_61.NET设计模式(4):建造者模式(Builder Pattern)_ide_62        {

20.NET设计模式(4):建造者模式(Builder Pattern)_时序图_63            food.Add(strName,Price);

21.NET设计模式(4):建造者模式(Builder Pattern)_建造者_64        }

22.NET设计模式(4):建造者模式(Builder Pattern)_时序图_65        

23.NET设计模式(4):建造者模式(Builder Pattern)_建造者_66.NET设计模式(4):建造者模式(Builder Pattern)_ide_67        /// <summary>

24.NET设计模式(4):建造者模式(Builder Pattern)_封装_68        /// 显示食品清单

25.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_69        /// </summary>

26.NET设计模式(4):建造者模式(Builder Pattern)_建造者_70        public void Show()

27.NET设计模式(4):建造者模式(Builder Pattern)_建造者_71.NET设计模式(4):建造者模式(Builder Pattern)_建造者_72        {

28.NET设计模式(4):建造者模式(Builder Pattern)_ide_73            IDictionaryEnumerator myEnumerator  = food.GetEnumerator();

29.NET设计模式(4):建造者模式(Builder Pattern)_封装_74            Console.WriteLine("Food List:");

30.NET设计模式(4):建造者模式(Builder Pattern)_建造者_75            Console.WriteLine("------------------------------");

31.NET设计模式(4):建造者模式(Builder Pattern)_建造者_76            string strfoodlist = "";

32.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_77            while(myEnumerator.MoveNext())

33.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_78.NET设计模式(4):建造者模式(Builder Pattern)_时序图_79            {

34.NET设计模式(4):建造者模式(Builder Pattern)_建造者_80                strfoodlist = strfoodlist + "\n\n" + myEnumerator.Key.ToString();

35.NET设计模式(4):建造者模式(Builder Pattern)_建造者_81                strfoodlist = strfoodlist + ":\t" +myEnumerator.Value.ToString();

36.NET设计模式(4):建造者模式(Builder Pattern)_建造者_82            }

37.NET设计模式(4):建造者模式(Builder Pattern)_时序图_83            Console.WriteLine(strfoodlist);

38.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_84            Console.WriteLine("\n------------------------------");

39.NET设计模式(4):建造者模式(Builder Pattern)_ide_85        }

40.NET设计模式(4):建造者模式(Builder Pattern)_ide_86    }

41.NET设计模式(4):建造者模式(Builder Pattern)_时序图_87}

42.NET设计模式(4):建造者模式(Builder Pattern)_时序图_88

2.指导者通知建造器。收银员(指导者)告知餐馆员工准备套餐。这里我们准备套餐的顺序是:放入汉堡,可乐倒入杯中,薯条放入盒中,并把这些东西都放在盘子上。这个过程对于普通套餐和黄金套餐来说都是一样的,不同的是它们的汉堡,可乐,薯条价格不同而已。如时序图红色部分所示:

.NET设计模式(4):建造者模式(Builder Pattern)_时序图_89

程序实现:


 1.NET设计模式(4):建造者模式(Builder Pattern)_ide_90using System;

 2.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_91

 3.NET设计模式(4):建造者模式(Builder Pattern)_封装_92namespace KFC

 4.NET设计模式(4):建造者模式(Builder Pattern)_时序图_93.NET设计模式(4):建造者模式(Builder Pattern)_建造者_94{

 5.NET设计模式(4):建造者模式(Builder Pattern)_建造者_95.NET设计模式(4):建造者模式(Builder Pattern)_建造者_96    /// <summary>

 6.NET设计模式(4):建造者模式(Builder Pattern)_时序图_97    /// FoodManager类,即指导者

 7.NET设计模式(4):建造者模式(Builder Pattern)_封装_98    /// </summary>

 8.NET设计模式(4):建造者模式(Builder Pattern)_封装_99    public class FoodManager

 9.NET设计模式(4):建造者模式(Builder Pattern)_封装_100.NET设计模式(4):建造者模式(Builder Pattern)_ide_101    {

10.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_102        public void Construct(Builder builder)

11.NET设计模式(4):建造者模式(Builder Pattern)_封装_103.NET设计模式(4):建造者模式(Builder Pattern)_ide_104        {

12.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_105            builder.BuildHamb();

13.NET设计模式(4):建造者模式(Builder Pattern)_ide_106

14.NET设计模式(4):建造者模式(Builder Pattern)_时序图_107            builder.BuildCoke();

15.NET设计模式(4):建造者模式(Builder Pattern)_建造者_108

16.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_109            builder.BuildChip();

17.NET设计模式(4):建造者模式(Builder Pattern)_ide_110        }    

18.NET设计模式(4):建造者模式(Builder Pattern)_建造者_111    }

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

20.NET设计模式(4):建造者模式(Builder Pattern)_时序图_113

3.建造者处理指导者的要求,并将部件添加到产品中。餐馆员工(建造者)按照收银员要求的把对应的汉堡,可乐,薯条放入盘子中。这部分是建造者模式里面富于变化的部分,因为顾客选择的套餐不同,套餐的组装过程也不同,这步完成产品对象的创建工作。

程序实现:


 1.NET设计模式(4):建造者模式(Builder Pattern)_ide_114using System;

 2.NET设计模式(4):建造者模式(Builder Pattern)_时序图_115

 3.NET设计模式(4):建造者模式(Builder Pattern)_ide_116namespace KFC

 4.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_117.NET设计模式(4):建造者模式(Builder Pattern)_ide_118{

 5.NET设计模式(4):建造者模式(Builder Pattern)_ide_119.NET设计模式(4):建造者模式(Builder Pattern)_时序图_120    /// <summary>

 6.NET设计模式(4):建造者模式(Builder Pattern)_ide_121    /// Builder类,即抽象建造者类,构造套餐

 7.NET设计模式(4):建造者模式(Builder Pattern)_建造者_122    /// </summary>

 8.NET设计模式(4):建造者模式(Builder Pattern)_建造者_123    public abstract class Builder

 9.NET设计模式(4):建造者模式(Builder Pattern)_封装_124.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_125    {    

10.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_126.NET设计模式(4):建造者模式(Builder Pattern)_建造者_127        /// <summary>

11.NET设计模式(4):建造者模式(Builder Pattern)_时序图_128        /// 添加汉堡

12.NET设计模式(4):建造者模式(Builder Pattern)_建造者_129        /// </summary>

13.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_130        public abstract void BuildHamb();

14.NET设计模式(4):建造者模式(Builder Pattern)_封装_131        

15.NET设计模式(4):建造者模式(Builder Pattern)_封装_132.NET设计模式(4):建造者模式(Builder Pattern)_封装_133        /// <summary>

16.NET设计模式(4):建造者模式(Builder Pattern)_时序图_134        /// 添加可乐

17.NET设计模式(4):建造者模式(Builder Pattern)_时序图_135        /// </summary>

18.NET设计模式(4):建造者模式(Builder Pattern)_时序图_136        public abstract void BuildCoke();

19.NET设计模式(4):建造者模式(Builder Pattern)_封装_137        

20.NET设计模式(4):建造者模式(Builder Pattern)_封装_138.NET设计模式(4):建造者模式(Builder Pattern)_封装_139        /// <summary>

21.NET设计模式(4):建造者模式(Builder Pattern)_封装_140        /// 添加薯条

22.NET设计模式(4):建造者模式(Builder Pattern)_建造者_141        /// </summary>

23.NET设计模式(4):建造者模式(Builder Pattern)_时序图_142        public abstract void BuildChip();

24.NET设计模式(4):建造者模式(Builder Pattern)_时序图_143        

25.NET设计模式(4):建造者模式(Builder Pattern)_时序图_144.NET设计模式(4):建造者模式(Builder Pattern)_ide_145        /// <summary>

26.NET设计模式(4):建造者模式(Builder Pattern)_ide_146        /// 返回结果

27.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_147        /// </summary>

28.NET设计模式(4):建造者模式(Builder Pattern)_ide_148        /// <returns>食品对象</returns>

29.NET设计模式(4):建造者模式(Builder Pattern)_建造者_149        public abstract Food GetFood();

30.NET设计模式(4):建造者模式(Builder Pattern)_建造者_150    }

31.NET设计模式(4):建造者模式(Builder Pattern)_ide_151}

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


 1.NET设计模式(4):建造者模式(Builder Pattern)_封装_153using System;

 2.NET设计模式(4):建造者模式(Builder Pattern)_封装_154

 3.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_155namespace KFC

 4.NET设计模式(4):建造者模式(Builder Pattern)_ide_156.NET设计模式(4):建造者模式(Builder Pattern)_ide_157{

 5.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_158.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_159    /// <summary>

 6.NET设计模式(4):建造者模式(Builder Pattern)_ide_160    /// NormalBuilder类,具体构造者,普通套餐

 7.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_161    /// </summary>

 8.NET设计模式(4):建造者模式(Builder Pattern)_建造者_162    public class NormalBuilder:Builder

 9.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_163.NET设计模式(4):建造者模式(Builder Pattern)_ide_164    {

10.NET设计模式(4):建造者模式(Builder Pattern)_ide_165        private Food NormalFood = new Food();

11.NET设计模式(4):建造者模式(Builder Pattern)_建造者_166

12.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_167        public override void BuildHamb()

13.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_168.NET设计模式(4):建造者模式(Builder Pattern)_ide_169        {

14.NET设计模式(4):建造者模式(Builder Pattern)_ide_170            NormalFood.Add("NormalHamb","¥10.50");

15.NET设计模式(4):建造者模式(Builder Pattern)_建造者_171        }

16.NET设计模式(4):建造者模式(Builder Pattern)_时序图_172        

17.NET设计模式(4):建造者模式(Builder Pattern)_建造者_173        public override void BuildCoke()

18.NET设计模式(4):建造者模式(Builder Pattern)_封装_174.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_175        {

19.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_176            NormalFood.Add("CokeCole","¥4.50");

20.NET设计模式(4):建造者模式(Builder Pattern)_封装_177        }

21.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_178

22.NET设计模式(4):建造者模式(Builder Pattern)_ide_179        public override void BuildChip()

23.NET设计模式(4):建造者模式(Builder Pattern)_封装_180.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_181        {

24.NET设计模式(4):建造者模式(Builder Pattern)_封装_182            NormalFood.Add("FireChips","¥2.00");

25.NET设计模式(4):建造者模式(Builder Pattern)_ide_183        }

26.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_184

27.NET设计模式(4):建造者模式(Builder Pattern)_建造者_185        public override Food GetFood()

28.NET设计模式(4):建造者模式(Builder Pattern)_ide_186.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_187        {

29.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_188            return NormalFood;

30.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_189        }

31.NET设计模式(4):建造者模式(Builder Pattern)_ide_190

32.NET设计模式(4):建造者模式(Builder Pattern)_时序图_191    }

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

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


 1.NET设计模式(4):建造者模式(Builder Pattern)_建造者_194using System;

 2.NET设计模式(4):建造者模式(Builder Pattern)_ide_195

 3.NET设计模式(4):建造者模式(Builder Pattern)_封装_196namespace KFC

 4.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_197.NET设计模式(4):建造者模式(Builder Pattern)_建造者_198{

 5.NET设计模式(4):建造者模式(Builder Pattern)_建造者_199.NET设计模式(4):建造者模式(Builder Pattern)_建造者_200    /// <summary>

 6.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_201    /// GoldBuilder类,具体构造者,黄金套餐

 7.NET设计模式(4):建造者模式(Builder Pattern)_建造者_202    /// </summary>

 8.NET设计模式(4):建造者模式(Builder Pattern)_建造者_203    public class GoldBuilder:Builder

 9.NET设计模式(4):建造者模式(Builder Pattern)_封装_204.NET设计模式(4):建造者模式(Builder Pattern)_建造者_205    {

10.NET设计模式(4):建造者模式(Builder Pattern)_建造者_206        private Food GoldFood = new Food();

11.NET设计模式(4):建造者模式(Builder Pattern)_时序图_207

12.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_208        public override void BuildHamb()

13.NET设计模式(4):建造者模式(Builder Pattern)_建造者_209.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_210        {

14.NET设计模式(4):建造者模式(Builder Pattern)_时序图_211            GoldFood.Add("GoldHamb","¥13.50");

15.NET设计模式(4):建造者模式(Builder Pattern)_建造者_212        }

16.NET设计模式(4):建造者模式(Builder Pattern)_ide_213        

17.NET设计模式(4):建造者模式(Builder Pattern)_时序图_214        public override void BuildCoke()

18.NET设计模式(4):建造者模式(Builder Pattern)_时序图_215.NET设计模式(4):建造者模式(Builder Pattern)_封装_216        {

19.NET设计模式(4):建造者模式(Builder Pattern)_封装_217            GoldFood.Add("CokeCole","¥4.50");

20.NET设计模式(4):建造者模式(Builder Pattern)_建造者_218        }

21.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_219

22.NET设计模式(4):建造者模式(Builder Pattern)_封装_220        public override void BuildChip()

23.NET设计模式(4):建造者模式(Builder Pattern)_封装_221.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_222        {

24.NET设计模式(4):建造者模式(Builder Pattern)_ide_223            GoldFood.Add("FireChips","¥3.50");

25.NET设计模式(4):建造者模式(Builder Pattern)_时序图_224        }

26.NET设计模式(4):建造者模式(Builder Pattern)_封装_225

27.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_226        public override Food GetFood()

28.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_227.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_228        {

29.NET设计模式(4):建造者模式(Builder Pattern)_封装_229            return GoldFood;

30.NET设计模式(4):建造者模式(Builder Pattern)_封装_230        }

31.NET设计模式(4):建造者模式(Builder Pattern)_封装_231

32.NET设计模式(4):建造者模式(Builder Pattern)_建造者_232    }

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

34.NET设计模式(4):建造者模式(Builder Pattern)_封装_234


4.客户从建造者检索产品。从餐馆员工准备好套餐后,顾客再从餐馆员工那儿拿回套餐。这步客户程序要做的仅仅是取回已经生成的产品对象,如时序图中红色部分所示。

.NET设计模式(4):建造者模式(Builder Pattern)_建造者_235

完整的客户程序:


 1.NET设计模式(4):建造者模式(Builder Pattern)_封装_236using System;

 2.NET设计模式(4):建造者模式(Builder Pattern)_时序图_237using System.Configuration;

 3.NET设计模式(4):建造者模式(Builder Pattern)_时序图_238using System.Reflection;

 4.NET设计模式(4):建造者模式(Builder Pattern)_封装_239

 5.NET设计模式(4):建造者模式(Builder Pattern)_建造者_240namespace KFC

 6.NET设计模式(4):建造者模式(Builder Pattern)_时序图_241.NET设计模式(4):建造者模式(Builder Pattern)_ide_242{

 7.NET设计模式(4):建造者模式(Builder Pattern)_ide_243.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_244    /// <summary>

 8.NET设计模式(4):建造者模式(Builder Pattern)_时序图_245    /// Client 类

 9.NET设计模式(4):建造者模式(Builder Pattern)_封装_246    /// </summary>

10.NET设计模式(4):建造者模式(Builder Pattern)_时序图_247    public class Client

11.NET设计模式(4):建造者模式(Builder Pattern)_ide_248.NET设计模式(4):建造者模式(Builder Pattern)_ide_249    {

12.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_250        public static void Main(string[] args)

13.NET设计模式(4):建造者模式(Builder Pattern)_建造者_251.NET设计模式(4):建造者模式(Builder Pattern)_时序图_252        {

14.NET设计模式(4):建造者模式(Builder Pattern)_建造者_253            FoodManager foodmanager = new FoodManager();

15.NET设计模式(4):建造者模式(Builder Pattern)_时序图_254

16.NET设计模式(4):建造者模式(Builder Pattern)_建造者_255            Builder instance;

17.NET设计模式(4):建造者模式(Builder Pattern)_ide_256

18.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_257            Console.WriteLine("Please Enter Food No:");

19.NET设计模式(4):建造者模式(Builder Pattern)_ide_258

20.NET设计模式(4):建造者模式(Builder Pattern)_ide_259            string No = Console.ReadLine();

21.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_260

22.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_261            string foodType = ConfigurationSettings.AppSettings["No"+No];

23.NET设计模式(4):建造者模式(Builder Pattern)_建造者_262

24.NET设计模式(4):建造者模式(Builder Pattern)_时序图_263            instance = (Builder)Assembly.Load("KFC").CreateInstance("KFC." + foodType);

25.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_264

26.NET设计模式(4):建造者模式(Builder Pattern)_ide_265            foodmanager.Construct(instance);

27.NET设计模式(4):建造者模式(Builder Pattern)_封装_266

28.NET设计模式(4):建造者模式(Builder Pattern)_建造者_267            Food food = instance.GetFood();

29.NET设计模式(4):建造者模式(Builder Pattern)_ide_268            food.Show();

30.NET设计模式(4):建造者模式(Builder Pattern)_时序图_269

31.NET设计模式(4):建造者模式(Builder Pattern)_ide_270            Console.ReadLine();

32.NET设计模式(4):建造者模式(Builder Pattern)_封装_271        }

33.NET设计模式(4):建造者模式(Builder Pattern)_ide_272    }

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

35.NET设计模式(4):建造者模式(Builder Pattern)_ide_274

通过分析不难看出,在这个例子中,在准备套餐的过程是稳定的,即按照一定的步骤去做,而套餐的组成部分则是变化的,有可能是普通套餐或黄金套餐等。这个变化就是建造者模式中的“变化点“,就是我们要封装的部分。

另外一个例子

在这里我们再给出另外一个关于建造房子的例子。客户程序通过调用指导者 (CDirector class)的BuildHouse()方法来创建一个房子。该方法有一个布尔型的参数blnBackyard,当blnBackyard为假时指导者将创建一个Apartment(Concrete Builder),当它为真时将创建一个Single Family Home(Concrete Builder)。这两种房子都实现了接口Ihouse。

程序实现:


  1.NET设计模式(4):建造者模式(Builder Pattern)_建造者_275//关于建造房屋的例子

  2.NET设计模式(4):建造者模式(Builder Pattern)_建造者_276using System;

  3.NET设计模式(4):建造者模式(Builder Pattern)_封装_277using System.Collections;

  4.NET设计模式(4):建造者模式(Builder Pattern)_建造者_278

  5.NET设计模式(4):建造者模式(Builder Pattern)_封装_279.NET设计模式(4):建造者模式(Builder Pattern)_封装_280/// <summary>

  6.NET设计模式(4):建造者模式(Builder Pattern)_封装_281/// 抽象建造者

  7.NET设计模式(4):建造者模式(Builder Pattern)_时序图_282/// </summary>

  8.NET设计模式(4):建造者模式(Builder Pattern)_时序图_283public interface IHouse

  9.NET设计模式(4):建造者模式(Builder Pattern)_时序图_284.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_285{

 10.NET设计模式(4):建造者模式(Builder Pattern)_时序图_286    bool GetBackyard();

 11.NET设计模式(4):建造者模式(Builder Pattern)_ide_287    long NoOfRooms();

 12.NET设计模式(4):建造者模式(Builder Pattern)_时序图_288    string  Description();

 13.NET设计模式(4):建造者模式(Builder Pattern)_时序图_289}

 14.NET设计模式(4):建造者模式(Builder Pattern)_建造者_290

 15.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_291.NET设计模式(4):建造者模式(Builder Pattern)_建造者_292/// <summary>

 16.NET设计模式(4):建造者模式(Builder Pattern)_建造者_293/// 具体建造者

 17.NET设计模式(4):建造者模式(Builder Pattern)_封装_294/// </summary>

 18.NET设计模式(4):建造者模式(Builder Pattern)_ide_295public class CApt:IHouse

 19.NET设计模式(4):建造者模式(Builder Pattern)_时序图_296.NET设计模式(4):建造者模式(Builder Pattern)_建造者_297{

 20.NET设计模式(4):建造者模式(Builder Pattern)_建造者_298    private bool mblnBackyard;

 21.NET设计模式(4):建造者模式(Builder Pattern)_ide_299    private Hashtable Rooms;

 22.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_300    public CApt()

 23.NET设计模式(4):建造者模式(Builder Pattern)_封装_301.NET设计模式(4):建造者模式(Builder Pattern)_时序图_302    {

 24.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_303        CRoom room;    

 25.NET设计模式(4):建造者模式(Builder Pattern)_时序图_304        Rooms = new Hashtable();

 26.NET设计模式(4):建造者模式(Builder Pattern)_时序图_305        room = new CRoom();

 27.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_306        room.RoomName = "Master Bedroom";

 28.NET设计模式(4):建造者模式(Builder Pattern)_封装_307        Rooms.Add ("room1",room);

 29.NET设计模式(4):建造者模式(Builder Pattern)_封装_308

 30.NET设计模式(4):建造者模式(Builder Pattern)_ide_309        room = new CRoom();

 31.NET设计模式(4):建造者模式(Builder Pattern)_建造者_310        room.RoomName = "Second Bedroom";

 32.NET设计模式(4):建造者模式(Builder Pattern)_时序图_311        Rooms.Add ("room2",room);

 33.NET设计模式(4):建造者模式(Builder Pattern)_封装_312

 34.NET设计模式(4):建造者模式(Builder Pattern)_ide_313        room = new CRoom();

 35.NET设计模式(4):建造者模式(Builder Pattern)_封装_314        room.RoomName = "Living Room";

 36.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_315        Rooms.Add ("room3",room);

 37.NET设计模式(4):建造者模式(Builder Pattern)_时序图_316        

 38.NET设计模式(4):建造者模式(Builder Pattern)_封装_317        mblnBackyard = false;

 39.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_318    }

 40.NET设计模式(4):建造者模式(Builder Pattern)_时序图_319

 41.NET设计模式(4):建造者模式(Builder Pattern)_封装_320    public bool GetBackyard()

 42.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_321.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_322    {

 43.NET设计模式(4):建造者模式(Builder Pattern)_封装_323        return mblnBackyard;

 44.NET设计模式(4):建造者模式(Builder Pattern)_时序图_324    }

 45.NET设计模式(4):建造者模式(Builder Pattern)_时序图_325    public long NoOfRooms()

 46.NET设计模式(4):建造者模式(Builder Pattern)_ide_326.NET设计模式(4):建造者模式(Builder Pattern)_ide_327    {

 47.NET设计模式(4):建造者模式(Builder Pattern)_ide_328        return Rooms.Count; 

 48.NET设计模式(4):建造者模式(Builder Pattern)_时序图_329    }

 49.NET设计模式(4):建造者模式(Builder Pattern)_封装_330    public string  Description()

 50.NET设计模式(4):建造者模式(Builder Pattern)_ide_331.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_332    {

 51.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_333        IDictionaryEnumerator myEnumerator  = Rooms.GetEnumerator();

 52.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_334        string strDescription;

 53.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_335        strDescription = "This is an Apartment with " + Rooms.Count + " Rooms \n";

 54.NET设计模式(4):建造者模式(Builder Pattern)_封装_336        strDescription = strDescription + "This Apartment doesn't have a backyard \n";                        

 55.NET设计模式(4):建造者模式(Builder Pattern)_ide_337        while (myEnumerator.MoveNext())

 56.NET设计模式(4):建造者模式(Builder Pattern)_建造者_338.NET设计模式(4):建造者模式(Builder Pattern)_建造者_339        {

 57.NET设计模式(4):建造者模式(Builder Pattern)_封装_340            strDescription = strDescription + "\n" + myEnumerator.Key + "\t" + ((CRoom)myEnumerator.Value).RoomName;

 58.NET设计模式(4):建造者模式(Builder Pattern)_时序图_341        }

 59.NET设计模式(4):建造者模式(Builder Pattern)_时序图_342        return strDescription;

 60.NET设计模式(4):建造者模式(Builder Pattern)_ide_343    }

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

 62.NET设计模式(4):建造者模式(Builder Pattern)_建造者_345

 63.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_346.NET设计模式(4):建造者模式(Builder Pattern)_封装_347/// <summary>

 64.NET设计模式(4):建造者模式(Builder Pattern)_ide_348/// 具体建造者

 65.NET设计模式(4):建造者模式(Builder Pattern)_ide_349/// </summary>

 66.NET设计模式(4):建造者模式(Builder Pattern)_建造者_350public class CSFH:IHouse

 67.NET设计模式(4):建造者模式(Builder Pattern)_ide_351.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_352{

 68.NET设计模式(4):建造者模式(Builder Pattern)_建造者_353    private bool mblnBackyard;

 69.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_354    private Hashtable Rooms;

 70.NET设计模式(4):建造者模式(Builder Pattern)_ide_355    public CSFH()

 71.NET设计模式(4):建造者模式(Builder Pattern)_建造者_356.NET设计模式(4):建造者模式(Builder Pattern)_封装_357    {

 72.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_358        CRoom room;

 73.NET设计模式(4):建造者模式(Builder Pattern)_ide_359        Rooms = new Hashtable();

 74.NET设计模式(4):建造者模式(Builder Pattern)_建造者_360

 75.NET设计模式(4):建造者模式(Builder Pattern)_建造者_361        room = new CRoom();

 76.NET设计模式(4):建造者模式(Builder Pattern)_时序图_362        room.RoomName = "Master Bedroom";

 77.NET设计模式(4):建造者模式(Builder Pattern)_封装_363        Rooms.Add ("room1",room);

 78.NET设计模式(4):建造者模式(Builder Pattern)_时序图_364

 79.NET设计模式(4):建造者模式(Builder Pattern)_建造者_365        room = new CRoom();

 80.NET设计模式(4):建造者模式(Builder Pattern)_封装_366        room.RoomName = "Second Bedroom";

 81.NET设计模式(4):建造者模式(Builder Pattern)_封装_367        Rooms.Add ("room2",room);

 82.NET设计模式(4):建造者模式(Builder Pattern)_ide_368

 83.NET设计模式(4):建造者模式(Builder Pattern)_时序图_369        room = new CRoom();

 84.NET设计模式(4):建造者模式(Builder Pattern)_建造者_370        room.RoomName = "Third Room";

 85.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_371        Rooms.Add ("room3",room);

 86.NET设计模式(4):建造者模式(Builder Pattern)_时序图_372        

 87.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_373        room = new CRoom();

 88.NET设计模式(4):建造者模式(Builder Pattern)_封装_374        room.RoomName = "Living Room";

 89.NET设计模式(4):建造者模式(Builder Pattern)_建造者_375        Rooms.Add ("room4",room);

 90.NET设计模式(4):建造者模式(Builder Pattern)_封装_376

 91.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_377        room = new CRoom();

 92.NET设计模式(4):建造者模式(Builder Pattern)_时序图_378        room.RoomName = "Guest Room";

 93.NET设计模式(4):建造者模式(Builder Pattern)_封装_379        Rooms.Add ("room5",room);

 94.NET设计模式(4):建造者模式(Builder Pattern)_ide_380

 95.NET设计模式(4):建造者模式(Builder Pattern)_时序图_381        mblnBackyard = true;

 96.NET设计模式(4):建造者模式(Builder Pattern)_封装_382 

 97.NET设计模式(4):建造者模式(Builder Pattern)_时序图_383    }

 98.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_384

 99.NET设计模式(4):建造者模式(Builder Pattern)_建造者_385    public bool GetBackyard()

100.NET设计模式(4):建造者模式(Builder Pattern)_ide_386.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_387    {

101.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_388        return mblnBackyard;

102.NET设计模式(4):建造者模式(Builder Pattern)_封装_389    }

103.NET设计模式(4):建造者模式(Builder Pattern)_封装_390    public long NoOfRooms()

104.NET设计模式(4):建造者模式(Builder Pattern)_ide_391.NET设计模式(4):建造者模式(Builder Pattern)_建造者_392    {

105.NET设计模式(4):建造者模式(Builder Pattern)_时序图_393        return Rooms.Count;

106.NET设计模式(4):建造者模式(Builder Pattern)_ide_394    }

107.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_395    public string  Description()

108.NET设计模式(4):建造者模式(Builder Pattern)_ide_396.NET设计模式(4):建造者模式(Builder Pattern)_ide_397    {

109.NET设计模式(4):建造者模式(Builder Pattern)_封装_398        IDictionaryEnumerator myEnumerator  = Rooms.GetEnumerator();

110.NET设计模式(4):建造者模式(Builder Pattern)_封装_399        string strDescription;

111.NET设计模式(4):建造者模式(Builder Pattern)_ide_400        strDescription = "This is an Single Family Home with " + Rooms.Count + " Rooms \n";

112.NET设计模式(4):建造者模式(Builder Pattern)_ide_401        strDescription = strDescription + "This house has a backyard \n"; 

113.NET设计模式(4):建造者模式(Builder Pattern)_ide_402        while (myEnumerator.MoveNext())

114.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_403.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_404        {

115.NET设计模式(4):建造者模式(Builder Pattern)_封装_405            strDescription = strDescription + "\n" + myEnumerator.Key + "\t" + ((CRoom)myEnumerator.Value).RoomName; 

116.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_406        }      

117.NET设计模式(4):建造者模式(Builder Pattern)_封装_407        return strDescription;

118.NET设计模式(4):建造者模式(Builder Pattern)_ide_408    }

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

120.NET设计模式(4):建造者模式(Builder Pattern)_封装_410

121.NET设计模式(4):建造者模式(Builder Pattern)_时序图_411public interface IRoom

122.NET设计模式(4):建造者模式(Builder Pattern)_封装_412.NET设计模式(4):建造者模式(Builder Pattern)_建造者_413{

123.NET设计模式(4):建造者模式(Builder Pattern)_时序图_414.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_415    string RoomName{get;set;}

124.NET设计模式(4):建造者模式(Builder Pattern)_建造者_416}

125.NET设计模式(4):建造者模式(Builder Pattern)_时序图_417

126.NET设计模式(4):建造者模式(Builder Pattern)_封装_418public class CRoom:IRoom

127.NET设计模式(4):建造者模式(Builder Pattern)_ide_419.NET设计模式(4):建造者模式(Builder Pattern)_封装_420{

128.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_421    private string mstrRoomName;

129.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_422    public string RoomName

130.NET设计模式(4):建造者模式(Builder Pattern)_建造者_423.NET设计模式(4):建造者模式(Builder Pattern)_时序图_424    {

131.NET设计模式(4):建造者模式(Builder Pattern)_时序图_425        get

132.NET设计模式(4):建造者模式(Builder Pattern)_ide_426.NET设计模式(4):建造者模式(Builder Pattern)_封装_427        {

133.NET设计模式(4):建造者模式(Builder Pattern)_时序图_428            return mstrRoomName;

134.NET设计模式(4):建造者模式(Builder Pattern)_ide_429        }

135.NET设计模式(4):建造者模式(Builder Pattern)_ide_430        set 

136.NET设计模式(4):建造者模式(Builder Pattern)_时序图_431.NET设计模式(4):建造者模式(Builder Pattern)_封装_432        {

137.NET设计模式(4):建造者模式(Builder Pattern)_建造者_433            mstrRoomName = value;

138.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_434        }

139.NET设计模式(4):建造者模式(Builder Pattern)_封装_435    }

140.NET设计模式(4):建造者模式(Builder Pattern)_封装_436}

141.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_437

142.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_438.NET设计模式(4):建造者模式(Builder Pattern)_ide_439/// <summary>

143.NET设计模式(4):建造者模式(Builder Pattern)_ide_440/// 指导者

144.NET设计模式(4):建造者模式(Builder Pattern)_ide_441/// </summary>

145.NET设计模式(4):建造者模式(Builder Pattern)_时序图_442public class CDirector

146.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_443.NET设计模式(4):建造者模式(Builder Pattern)_ide_444{

147    public IHouse BuildHouse(bool blnBackyard)

148.NET设计模式(4):建造者模式(Builder Pattern)_时序图_445.NET设计模式(4):建造者模式(Builder Pattern)_ide_446    {

149        if (blnBackyard)

150.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_447.NET设计模式(4):建造者模式(Builder Pattern)_ide_448        {

151.NET设计模式(4):建造者模式(Builder Pattern)_建造者_449            return new CSFH();

152.NET设计模式(4):建造者模式(Builder Pattern)_建造者_450        }

153.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_451        else

154.NET设计模式(4):建造者模式(Builder Pattern)_ide_452.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_453        {

155.NET设计模式(4):建造者模式(Builder Pattern)_时序图_454            return new CApt(); 

156.NET设计模式(4):建造者模式(Builder Pattern)_建造者_455        }

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

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

159.NET设计模式(4):建造者模式(Builder Pattern)_建造者_458

160.NET设计模式(4):建造者模式(Builder Pattern)_建造者_459.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_460/// <summary>

161.NET设计模式(4):建造者模式(Builder Pattern)_ide_461/// 客户程序

162.NET设计模式(4):建造者模式(Builder Pattern)_建造者_462/// </summary>

163.NET设计模式(4):建造者模式(Builder Pattern)_建造者_463public class Client

164{

165.NET设计模式(4):建造者模式(Builder Pattern)_时序图_464    static void Main(string[] args) 

166.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_465.NET设计模式(4):建造者模式(Builder Pattern)_ide_466    {

167.NET设计模式(4):建造者模式(Builder Pattern)_时序图_467        CDirector objDirector = new CDirector();

168.NET设计模式(4):建造者模式(Builder Pattern)_建造者_468        IHouse objHouse;

169.NET设计模式(4):建造者模式(Builder Pattern)_封装_469

170.NET设计模式(4):建造者模式(Builder Pattern)_建造者_470        string Input = Console.ReadLine();

171.NET设计模式(4):建造者模式(Builder Pattern)_ide_471        objHouse = objDirector.BuildHouse(bool.Parse(Input));

172.NET设计模式(4):建造者模式(Builder Pattern)_时序图_472    

173.NET设计模式(4):建造者模式(Builder Pattern)_封装_473        Console.WriteLine(objHouse.Description());

174.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_474        Console.ReadLine();

175.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_475    }

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

177.NET设计模式(4):建造者模式(Builder Pattern)_建造者_477

178.NET设计模式(4):建造者模式(Builder Pattern)_封装_478

建造者模式的几种演化

省略抽象建造者角色

系统中只需要一个具体建造者,省略掉抽象建造者,结构图如下:

.NET设计模式(4):建造者模式(Builder Pattern)_建造者_479

指导者代码如下:


 1.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_480 class Director

 2.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_481.NET设计模式(4):建造者模式(Builder Pattern)_建造者_482  {

 3.NET设计模式(4):建造者模式(Builder Pattern)_建造者_483   private ConcreteBuilder builder;

 4.NET设计模式(4):建造者模式(Builder Pattern)_ide_484 

 5.NET设计模式(4):建造者模式(Builder Pattern)_时序图_485   public void Construct()

 6.NET设计模式(4):建造者模式(Builder Pattern)_时序图_486.NET设计模式(4):建造者模式(Builder Pattern)_时序图_487    {

 7.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_488     builder.BuildPartA();

 8.NET设计模式(4):建造者模式(Builder Pattern)_建造者_489     builder.BuildPartB();

 9.NET设计模式(4):建造者模式(Builder Pattern)_ide_490   }

10.NET设计模式(4):建造者模式(Builder Pattern)_建造者_491 }

省略指导者角色

抽象建造者角色已经被省略掉,还可以省略掉指导者角色。让Builder角色自己扮演指导者与建造者双重角色。结构图如下:

.NET设计模式(4):建造者模式(Builder Pattern)_时序图_492

建造者角色代码如下:


 1.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_493 public class Builder

 2.NET设计模式(4):建造者模式(Builder Pattern)_时序图_494.NET设计模式(4):建造者模式(Builder Pattern)_时序图_495  {

 3.NET设计模式(4):建造者模式(Builder Pattern)_ide_496   private Product product = new Product();

 4.NET设计模式(4):建造者模式(Builder Pattern)_建造者_497 

 5.NET设计模式(4):建造者模式(Builder Pattern)_时序图_498   public void BuildPartA()

 6.NET设计模式(4):建造者模式(Builder Pattern)_封装_499.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_500    { 

 7.NET设计模式(4):建造者模式(Builder Pattern)_时序图_501     //.NET设计模式(4):建造者模式(Builder Pattern)_ide_502.NET设计模式(4):建造者模式(Builder Pattern)_ide_502

 8.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_504   }

 9.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_505 

10.NET设计模式(4):建造者模式(Builder Pattern)_封装_506   public void BuildPartB()

11.NET设计模式(4):建造者模式(Builder Pattern)_建造者_507.NET设计模式(4):建造者模式(Builder Pattern)_时序图_508    {

12.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_509     //.NET设计模式(4):建造者模式(Builder Pattern)_ide_502.NET设计模式(4):建造者模式(Builder Pattern)_ide_502

13.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_512   }

14.NET设计模式(4):建造者模式(Builder Pattern)_ide_513 

15.NET设计模式(4):建造者模式(Builder Pattern)_ide_514   public Product GetResult()

16.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_515.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_516    {

17.NET设计模式(4):建造者模式(Builder Pattern)_建造者_517     return product;

18.NET设计模式(4):建造者模式(Builder Pattern)_ide_518   }

19.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_519 

20.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_520   public void Construct()

21.NET设计模式(4):建造者模式(Builder Pattern)_时序图_521.NET设计模式(4):建造者模式(Builder Pattern)_时序图_522    {

22.NET设计模式(4):建造者模式(Builder Pattern)_ide_523     BuildPartA();

23.NET设计模式(4):建造者模式(Builder Pattern)_ide_524     BuildPartB();

24.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_525   }

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


客户程序:

 1.NET设计模式(4):建造者模式(Builder Pattern)_建造者_527 public class Client

 2.NET设计模式(4):建造者模式(Builder Pattern)_时序图_528.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_529  {

 3.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_530   private static Builder builder;

 4.NET设计模式(4):建造者模式(Builder Pattern)_时序图_531 

 5.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_532   public static void Main()

 6.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_533.NET设计模式(4):建造者模式(Builder Pattern)_封装_534    {

 7.NET设计模式(4):建造者模式(Builder Pattern)_建造者_535     builder = new Builder();

 8.NET设计模式(4):建造者模式(Builder Pattern)_ide_536     builder.Construct();

 9.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_537     Product product = builder.GetResult();

10.NET设计模式(4):建造者模式(Builder Pattern)_时序图_538   }

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


合并建造者角色和产品角色

建造模式失去抽象建造者角色和指导者角色后,可以进一步退化,从而失去具体建造者角色,此时具体建造者角色和产品角色合并,从而使得产品自己就是自己的建造者。这样做混淆了对象的建造者和对象本身,但是有时候一个产品对象有着固定的几个零件,而且永远只有这几个零件,此时将产品类和建造类合并,可以使系统简单易读。结构图如下:

.NET设计模式(4):建造者模式(Builder Pattern)_建造者模式_540

实现要点

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、 ……

总结

建造者模式的实质是解耦组装过程和创建具体部件,使得我们不用去关心每个部件是如何组装的。