建造者模式(Builder Pattern)

——.NET设计模式系列之四

Terrylee,2005年12月17日

概述

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

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

意图

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

模型图

第3章 建造者模式(Builder Pattern)

生活中的例子

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

第3章 建造者模式(Builder Pattern)

实现过程图解

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

第3章 建造者模式(Builder Pattern)

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

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

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

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

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

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

第3章 建造者模式(Builder Pattern)

程序实现:

1第3章 建造者模式(Builder Pattern)usingSystem;
2第3章 建造者模式(Builder Pattern)usingSystem.Configuration;
3第3章 建造者模式(Builder Pattern)usingSystem.Reflection;
4第3章 建造者模式(Builder Pattern)
5第3章 建造者模式(Builder Pattern)namespaceKFC
6第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
7第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)/**////<summary>
8第3章 建造者模式(Builder Pattern)///Client类
9第3章 建造者模式(Builder Pattern)///</summary>
10第3章 建造者模式(Builder Pattern)publicclassClient
11第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
12第3章 建造者模式(Builder Pattern)publicstaticvoidMain(string[]args)
13第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
14第3章 建造者模式(Builder Pattern)FoodManagerfoodmanager=newFoodManager();
15第3章 建造者模式(Builder Pattern)
16第3章 建造者模式(Builder Pattern)Builderinstance;
17第3章 建造者模式(Builder Pattern)
18第3章 建造者模式(Builder Pattern)Console.WriteLine("PleaseEnterFoodNo:");
19第3章 建造者模式(Builder Pattern)
20第3章 建造者模式(Builder Pattern)stringNo=Console.ReadLine();
21第3章 建造者模式(Builder Pattern)
22第3章 建造者模式(Builder Pattern)stringfoodType=ConfigurationSettings.AppSettings["No"+No];
23第3章 建造者模式(Builder Pattern)
24第3章 建造者模式(Builder Pattern)instance=(Builder)Assembly.Load("KFC").CreateInstance("KFC."+foodType);
25第3章 建造者模式(Builder Pattern)
26第3章 建造者模式(Builder Pattern)foodmanager.Construct(instance);
27第3章 建造者模式(Builder Pattern)}
28第3章 建造者模式(Builder Pattern)}
29第3章 建造者模式(Builder Pattern)}
30第3章 建造者模式(Builder Pattern)

产品(套餐)类:

1第3章 建造者模式(Builder Pattern)usingSystem;
2第3章 建造者模式(Builder Pattern)usingSystem.Collections;
3第3章 建造者模式(Builder Pattern)
4第3章 建造者模式(Builder Pattern)namespaceKFC
5第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
6第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)/**////<summary>
7第3章 建造者模式(Builder Pattern)///Food类,即产品类
8第3章 建造者模式(Builder Pattern)///</summary>
9第3章 建造者模式(Builder Pattern)publicclassFood
10第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
11第3章 建造者模式(Builder Pattern)Hashtablefood=newHashtable();
12第3章 建造者模式(Builder Pattern)
13第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)/**////<summary>
14第3章 建造者模式(Builder Pattern)///添加食品
15第3章 建造者模式(Builder Pattern)///</summary>
16第3章 建造者模式(Builder Pattern)///<paramname="strName">食品名称</param>
17第3章 建造者模式(Builder Pattern)///<paramname="Price">价格</param>
18第3章 建造者模式(Builder Pattern)publicvoidAdd(stringstrName,stringPrice)
19第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
20第3章 建造者模式(Builder Pattern)food.Add(strName,Price);
21第3章 建造者模式(Builder Pattern)}
22第3章 建造者模式(Builder Pattern)
23第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)/**////<summary>
24第3章 建造者模式(Builder Pattern)///显示食品清单
25第3章 建造者模式(Builder Pattern)///</summary>
26第3章 建造者模式(Builder Pattern)publicvoidShow()
27第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
28第3章 建造者模式(Builder Pattern)IDictionaryEnumeratormyEnumerator=food.GetEnumerator();
29第3章 建造者模式(Builder Pattern)Console.WriteLine("FoodList:");
30第3章 建造者模式(Builder Pattern)Console.WriteLine("------------------------------");
31第3章 建造者模式(Builder Pattern)stringstrfoodlist="";
32第3章 建造者模式(Builder Pattern)while(myEnumerator.MoveNext())
33第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
34第3章 建造者模式(Builder Pattern)strfoodlist=strfoodlist+"\n\n"+myEnumerator.Key.ToString();
35第3章 建造者模式(Builder Pattern)strfoodlist=strfoodlist+":\t"+myEnumerator.Value.ToString();
36第3章 建造者模式(Builder Pattern)}
37第3章 建造者模式(Builder Pattern)Console.WriteLine(strfoodlist);
38第3章 建造者模式(Builder Pattern)Console.WriteLine("\n------------------------------");
39第3章 建造者模式(Builder Pattern)}
40第3章 建造者模式(Builder Pattern)}
41第3章 建造者模式(Builder Pattern)}
42第3章 建造者模式(Builder Pattern)

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

第3章 建造者模式(Builder Pattern)

程序实现:

1第3章 建造者模式(Builder Pattern)usingSystem;
2第3章 建造者模式(Builder Pattern)
3第3章 建造者模式(Builder Pattern)namespaceKFC
4第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
5第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)/**////<summary>
6第3章 建造者模式(Builder Pattern)///FoodManager类,即指导者
7第3章 建造者模式(Builder Pattern)///</summary>
8第3章 建造者模式(Builder Pattern)publicclassFoodManager
9第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
10第3章 建造者模式(Builder Pattern)publicvoidConstruct(Builderbuilder)
11第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
12第3章 建造者模式(Builder Pattern)builder.BuildHamb();
13第3章 建造者模式(Builder Pattern)
14第3章 建造者模式(Builder Pattern)builder.BuildCoke();
15第3章 建造者模式(Builder Pattern)
16第3章 建造者模式(Builder Pattern)builder.BuildChip();
17第3章 建造者模式(Builder Pattern)}
18第3章 建造者模式(Builder Pattern)}
19第3章 建造者模式(Builder Pattern)}
20第3章 建造者模式(Builder Pattern)

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

程序实现:

1第3章 建造者模式(Builder Pattern)usingSystem;
2第3章 建造者模式(Builder Pattern)
3第3章 建造者模式(Builder Pattern)namespaceKFC
4第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
5第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)/**////<summary>
6第3章 建造者模式(Builder Pattern)///Builder类,即抽象建造者类,构造套餐
7第3章 建造者模式(Builder Pattern)///</summary>
8第3章 建造者模式(Builder Pattern)publicabstractclassBuilder
9第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
10第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)/**////<summary>
11第3章 建造者模式(Builder Pattern)///添加汉堡
12第3章 建造者模式(Builder Pattern)///</summary>
13第3章 建造者模式(Builder Pattern)publicabstractvoidBuildHamb();
14第3章 建造者模式(Builder Pattern)
15第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)/**////<summary>
16第3章 建造者模式(Builder Pattern)///添加可乐
17第3章 建造者模式(Builder Pattern)///</summary>
18第3章 建造者模式(Builder Pattern)publicabstractvoidBuildCoke();
19第3章 建造者模式(Builder Pattern)
20第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)/**////<summary>
21第3章 建造者模式(Builder Pattern)///添加薯条
22第3章 建造者模式(Builder Pattern)///</summary>
23第3章 建造者模式(Builder Pattern)publicabstractvoidBuildChip();
24第3章 建造者模式(Builder Pattern)
25第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)/**////<summary>
26第3章 建造者模式(Builder Pattern)///返回结果
27第3章 建造者模式(Builder Pattern)///</summary>
28第3章 建造者模式(Builder Pattern)///<returns>食品对象</returns>
29第3章 建造者模式(Builder Pattern)publicabstractFoodGetFood();
30第3章 建造者模式(Builder Pattern)}
31第3章 建造者模式(Builder Pattern)}
32第3章 建造者模式(Builder Pattern)

1第3章 建造者模式(Builder Pattern)usingSystem;
2第3章 建造者模式(Builder Pattern)
3第3章 建造者模式(Builder Pattern)namespaceKFC
4第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
5第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)/**////<summary>
6第3章 建造者模式(Builder Pattern)///NormalBuilder类,具体构造者,普通套餐
7第3章 建造者模式(Builder Pattern)///</summary>
8第3章 建造者模式(Builder Pattern)publicclassNormalBuilder:Builder
9第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
10第3章 建造者模式(Builder Pattern)privateFoodNormalFood=newFood();
11第3章 建造者模式(Builder Pattern)
12第3章 建造者模式(Builder Pattern)publicoverridevoidBuildHamb()
13第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
14第3章 建造者模式(Builder Pattern)NormalFood.Add("NormalHamb","¥10.50");
15第3章 建造者模式(Builder Pattern)}
16第3章 建造者模式(Builder Pattern)
17第3章 建造者模式(Builder Pattern)publicoverridevoidBuildCoke()
18第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
19第3章 建造者模式(Builder Pattern)NormalFood.Add("CokeCole","¥4.50");
20第3章 建造者模式(Builder Pattern)}
21第3章 建造者模式(Builder Pattern)
22第3章 建造者模式(Builder Pattern)publicoverridevoidBuildChip()
23第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
24第3章 建造者模式(Builder Pattern)NormalFood.Add("FireChips","¥2.00");
25第3章 建造者模式(Builder Pattern)}
26第3章 建造者模式(Builder Pattern)
27第3章 建造者模式(Builder Pattern)publicoverrideFoodGetFood()
28第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
29第3章 建造者模式(Builder Pattern)returnNormalFood;
30第3章 建造者模式(Builder Pattern)}
31第3章 建造者模式(Builder Pattern)
32第3章 建造者模式(Builder Pattern)}
33第3章 建造者模式(Builder Pattern)}
34第3章 建造者模式(Builder Pattern)

1第3章 建造者模式(Builder Pattern)usingSystem;
2第3章 建造者模式(Builder Pattern)
3第3章 建造者模式(Builder Pattern)namespaceKFC
4第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
5第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)/**////<summary>
6第3章 建造者模式(Builder Pattern)///GoldBuilder类,具体构造者,黄金套餐
7第3章 建造者模式(Builder Pattern)///</summary>
8第3章 建造者模式(Builder Pattern)publicclassGoldBuilder:Builder
9第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
10第3章 建造者模式(Builder Pattern)privateFoodGoldFood=newFood();
11第3章 建造者模式(Builder Pattern)
12第3章 建造者模式(Builder Pattern)publicoverridevoidBuildHamb()
13第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
14第3章 建造者模式(Builder Pattern)GoldFood.Add("GoldHamb","¥13.50");
15第3章 建造者模式(Builder Pattern)}
16第3章 建造者模式(Builder Pattern)
17第3章 建造者模式(Builder Pattern)publicoverridevoidBuildCoke()
18第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
19第3章 建造者模式(Builder Pattern)GoldFood.Add("CokeCole","¥4.50");
20第3章 建造者模式(Builder Pattern)}
21第3章 建造者模式(Builder Pattern)
22第3章 建造者模式(Builder Pattern)publicoverridevoidBuildChip()
23第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
24第3章 建造者模式(Builder Pattern)GoldFood.Add("FireChips","¥3.50");
25第3章 建造者模式(Builder Pattern)}
26第3章 建造者模式(Builder Pattern)
27第3章 建造者模式(Builder Pattern)publicoverrideFoodGetFood()
28第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
29第3章 建造者模式(Builder Pattern)returnGoldFood;
30第3章 建造者模式(Builder Pattern)}
31第3章 建造者模式(Builder Pattern)
32第3章 建造者模式(Builder Pattern)}
33第3章 建造者模式(Builder Pattern)}
34第3章 建造者模式(Builder Pattern)

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

第3章 建造者模式(Builder Pattern)

完整的客户程序:

1第3章 建造者模式(Builder Pattern)usingSystem;
2第3章 建造者模式(Builder Pattern)usingSystem.Configuration;
3第3章 建造者模式(Builder Pattern)usingSystem.Reflection;
4第3章 建造者模式(Builder Pattern)
5第3章 建造者模式(Builder Pattern)namespaceKFC
6第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
7第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)/**////<summary>
8第3章 建造者模式(Builder Pattern)///Client类
9第3章 建造者模式(Builder Pattern)///</summary>
10第3章 建造者模式(Builder Pattern)publicclassClient
11第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
12第3章 建造者模式(Builder Pattern)publicstaticvoidMain(string[]args)
13第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
14第3章 建造者模式(Builder Pattern)FoodManagerfoodmanager=newFoodManager();
15第3章 建造者模式(Builder Pattern)
16第3章 建造者模式(Builder Pattern)Builderinstance;
17第3章 建造者模式(Builder Pattern)
18第3章 建造者模式(Builder Pattern)Console.WriteLine("PleaseEnterFoodNo:");
19第3章 建造者模式(Builder Pattern)
20第3章 建造者模式(Builder Pattern)stringNo=Console.ReadLine();
21第3章 建造者模式(Builder Pattern)
22第3章 建造者模式(Builder Pattern)stringfoodType=ConfigurationSettings.AppSettings["No"+No];
23第3章 建造者模式(Builder Pattern)
24第3章 建造者模式(Builder Pattern)instance=(Builder)Assembly.Load("KFC").CreateInstance("KFC."+foodType);
25第3章 建造者模式(Builder Pattern)
26第3章 建造者模式(Builder Pattern)foodmanager.Construct(instance);
27第3章 建造者模式(Builder Pattern)
28第3章 建造者模式(Builder Pattern)Foodfood=instance.GetFood();
29第3章 建造者模式(Builder Pattern)food.Show();
30第3章 建造者模式(Builder Pattern)
31第3章 建造者模式(Builder Pattern)Console.ReadLine();
32第3章 建造者模式(Builder Pattern)}
33第3章 建造者模式(Builder Pattern)}
34第3章 建造者模式(Builder Pattern)}
35第3章 建造者模式(Builder Pattern)

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

另外一个例子

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

程序实现:

1第3章 建造者模式(Builder Pattern)//关于建造房屋的例子
2第3章 建造者模式(Builder Pattern)usingSystem;
3第3章 建造者模式(Builder Pattern)usingSystem.Collections;
4第3章 建造者模式(Builder Pattern)
5第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)/**////<summary>
6第3章 建造者模式(Builder Pattern)///抽象建造者
7第3章 建造者模式(Builder Pattern)///</summary>
8第3章 建造者模式(Builder Pattern)publicinterfaceIHouse
9第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
10第3章 建造者模式(Builder Pattern)boolGetBackyard();
11第3章 建造者模式(Builder Pattern)longNoOfRooms();
12第3章 建造者模式(Builder Pattern)stringDescription();
13第3章 建造者模式(Builder Pattern)}
14第3章 建造者模式(Builder Pattern)
15第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)/**////<summary>
16第3章 建造者模式(Builder Pattern)///具体建造者
17第3章 建造者模式(Builder Pattern)///</summary>
18第3章 建造者模式(Builder Pattern)publicclassCApt:IHouse
19第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
20第3章 建造者模式(Builder Pattern)privateboolmblnBackyard;
21第3章 建造者模式(Builder Pattern)privateHashtableRooms;
22第3章 建造者模式(Builder Pattern)publicCApt()
23第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
24第3章 建造者模式(Builder Pattern)CRoomroom;
25第3章 建造者模式(Builder Pattern)Rooms=newHashtable();
26第3章 建造者模式(Builder Pattern)room=newCRoom();
27第3章 建造者模式(Builder Pattern)room.RoomName="MasterBedroom";
28第3章 建造者模式(Builder Pattern)Rooms.Add("room1",room);
29第3章 建造者模式(Builder Pattern)
30第3章 建造者模式(Builder Pattern)room=newCRoom();
31第3章 建造者模式(Builder Pattern)room.RoomName="SecondBedroom";
32第3章 建造者模式(Builder Pattern)Rooms.Add("room2",room);
33第3章 建造者模式(Builder Pattern)
34第3章 建造者模式(Builder Pattern)room=newCRoom();
35第3章 建造者模式(Builder Pattern)room.RoomName="LivingRoom";
36第3章 建造者模式(Builder Pattern)Rooms.Add("room3",room);
37第3章 建造者模式(Builder Pattern)
38第3章 建造者模式(Builder Pattern)mblnBackyard=false;
39第3章 建造者模式(Builder Pattern)}
40第3章 建造者模式(Builder Pattern)
41第3章 建造者模式(Builder Pattern)publicboolGetBackyard()
42第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
43第3章 建造者模式(Builder Pattern)returnmblnBackyard;
44第3章 建造者模式(Builder Pattern)}
45第3章 建造者模式(Builder Pattern)publiclongNoOfRooms()
46第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
47第3章 建造者模式(Builder Pattern)returnRooms.Count;
48第3章 建造者模式(Builder Pattern)}
49第3章 建造者模式(Builder Pattern)publicstringDescription()
50第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
51第3章 建造者模式(Builder Pattern)IDictionaryEnumeratormyEnumerator=Rooms.GetEnumerator();
52第3章 建造者模式(Builder Pattern)stringstrDescription;
53第3章 建造者模式(Builder Pattern)strDescription="ThisisanApartmentwith"+Rooms.Count+"Rooms\n";
54第3章 建造者模式(Builder Pattern)strDescription=strDescription+"ThisApartmentdoesn'thaveabackyard\n";
55第3章 建造者模式(Builder Pattern)while(myEnumerator.MoveNext())
56第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
57第3章 建造者模式(Builder Pattern)strDescription=strDescription+"\n"+myEnumerator.Key+"\t"+((CRoom)myEnumerator.Value).RoomName;
58第3章 建造者模式(Builder Pattern)}
59第3章 建造者模式(Builder Pattern)returnstrDescription;
60第3章 建造者模式(Builder Pattern)}
61第3章 建造者模式(Builder Pattern)}
62第3章 建造者模式(Builder Pattern)
63第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)/**////<summary>
64第3章 建造者模式(Builder Pattern)///具体建造者
65第3章 建造者模式(Builder Pattern)///</summary>
66第3章 建造者模式(Builder Pattern)publicclassCSFH:IHouse
67第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
68第3章 建造者模式(Builder Pattern)privateboolmblnBackyard;
69第3章 建造者模式(Builder Pattern)privateHashtableRooms;
70第3章 建造者模式(Builder Pattern)publicCSFH()
71第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
72第3章 建造者模式(Builder Pattern)CRoomroom;
73第3章 建造者模式(Builder Pattern)Rooms=newHashtable();
74第3章 建造者模式(Builder Pattern)
75第3章 建造者模式(Builder Pattern)room=newCRoom();
76第3章 建造者模式(Builder Pattern)room.RoomName="MasterBedroom";
77第3章 建造者模式(Builder Pattern)Rooms.Add("room1",room);
78第3章 建造者模式(Builder Pattern)
79第3章 建造者模式(Builder Pattern)room=newCRoom();
80第3章 建造者模式(Builder Pattern)room.RoomName="SecondBedroom";
81第3章 建造者模式(Builder Pattern)Rooms.Add("room2",room);
82第3章 建造者模式(Builder Pattern)
83第3章 建造者模式(Builder Pattern)room=newCRoom();
84第3章 建造者模式(Builder Pattern)room.RoomName="ThirdRoom";
85第3章 建造者模式(Builder Pattern)Rooms.Add("room3",room);
86第3章 建造者模式(Builder Pattern)
87第3章 建造者模式(Builder Pattern)room=newCRoom();
88第3章 建造者模式(Builder Pattern)room.RoomName="LivingRoom";
89第3章 建造者模式(Builder Pattern)Rooms.Add("room4",room);
90第3章 建造者模式(Builder Pattern)
91第3章 建造者模式(Builder Pattern)room=newCRoom();
92第3章 建造者模式(Builder Pattern)room.RoomName="GuestRoom";
93第3章 建造者模式(Builder Pattern)Rooms.Add("room5",room);
94第3章 建造者模式(Builder Pattern)
95第3章 建造者模式(Builder Pattern)mblnBackyard=true;
96第3章 建造者模式(Builder Pattern)
97第3章 建造者模式(Builder Pattern)}
98第3章 建造者模式(Builder Pattern)
99第3章 建造者模式(Builder Pattern)publicboolGetBackyard()
100第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
101第3章 建造者模式(Builder Pattern)returnmblnBackyard;
102第3章 建造者模式(Builder Pattern)}
103第3章 建造者模式(Builder Pattern)publiclongNoOfRooms()
104第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
105第3章 建造者模式(Builder Pattern)returnRooms.Count;
106第3章 建造者模式(Builder Pattern)}
107第3章 建造者模式(Builder Pattern)publicstringDescription()
108第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
109第3章 建造者模式(Builder Pattern)IDictionaryEnumeratormyEnumerator=Rooms.GetEnumerator();
110第3章 建造者模式(Builder Pattern)stringstrDescription;
111第3章 建造者模式(Builder Pattern)strDescription="ThisisanSingleFamilyHomewith"+Rooms.Count+"Rooms\n";
112第3章 建造者模式(Builder Pattern)strDescription=strDescription+"Thishousehasabackyard\n";
113第3章 建造者模式(Builder Pattern)while(myEnumerator.MoveNext())
114第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
115第3章 建造者模式(Builder Pattern)strDescription=strDescription+"\n"+myEnumerator.Key+"\t"+((CRoom)myEnumerator.Value).RoomName;
116第3章 建造者模式(Builder Pattern)}
117第3章 建造者模式(Builder Pattern)returnstrDescription;
118第3章 建造者模式(Builder Pattern)}
119第3章 建造者模式(Builder Pattern)}
120第3章 建造者模式(Builder Pattern)
121第3章 建造者模式(Builder Pattern)publicinterfaceIRoom
122第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
123第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)stringRoomName第3章 建造者模式(Builder Pattern){get;set;}
124第3章 建造者模式(Builder Pattern)}
125第3章 建造者模式(Builder Pattern)
126第3章 建造者模式(Builder Pattern)publicclassCRoom:IRoom
127第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
128第3章 建造者模式(Builder Pattern)privatestringmstrRoomName;
129第3章 建造者模式(Builder Pattern)publicstringRoomName
130第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
131第3章 建造者模式(Builder Pattern)get
132第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
133第3章 建造者模式(Builder Pattern)returnmstrRoomName;
134第3章 建造者模式(Builder Pattern)}
135第3章 建造者模式(Builder Pattern)set
136第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
137第3章 建造者模式(Builder Pattern)mstrRoomName=value;
138第3章 建造者模式(Builder Pattern)}
139第3章 建造者模式(Builder Pattern)}
140第3章 建造者模式(Builder Pattern)}
141第3章 建造者模式(Builder Pattern)
142第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)/**////<summary>
143第3章 建造者模式(Builder Pattern)///指导者
144第3章 建造者模式(Builder Pattern)///</summary>
145第3章 建造者模式(Builder Pattern)publicclassCDirector
146第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
147第3章 建造者模式(Builder Pattern)publicIHouseBuildHouse(boolblnBackyard)
148第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
149第3章 建造者模式(Builder Pattern)if(blnBackyard)
150第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
151第3章 建造者模式(Builder Pattern)returnnewCSFH();
152第3章 建造者模式(Builder Pattern)}
153第3章 建造者模式(Builder Pattern)else
154第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
155第3章 建造者模式(Builder Pattern)returnnewCApt();
156第3章 建造者模式(Builder Pattern)}
157第3章 建造者模式(Builder Pattern)}
158第3章 建造者模式(Builder Pattern)}
159第3章 建造者模式(Builder Pattern)
160第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)/**////<summary>
161第3章 建造者模式(Builder Pattern)///客户程序
162第3章 建造者模式(Builder Pattern)///</summary>
163第3章 建造者模式(Builder Pattern)publicclassClient
164第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
165第3章 建造者模式(Builder Pattern)staticvoidMain(string[]args)
166第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
167第3章 建造者模式(Builder Pattern)CDirectorobjDirector=newCDirector();
168第3章 建造者模式(Builder Pattern)IHouseobjHouse;
169第3章 建造者模式(Builder Pattern)
170第3章 建造者模式(Builder Pattern)stringInput=Console.ReadLine();
171第3章 建造者模式(Builder Pattern)objHouse=objDirector.BuildHouse(bool.Parse(Input));
172第3章 建造者模式(Builder Pattern)
173第3章 建造者模式(Builder Pattern)Console.WriteLine(objHouse.Description());
174第3章 建造者模式(Builder Pattern)Console.ReadLine();
175第3章 建造者模式(Builder Pattern)}
176第3章 建造者模式(Builder Pattern)}
177第3章 建造者模式(Builder Pattern)
178第3章 建造者模式(Builder Pattern)

建造者模式的几种演化

省略抽象建造者角色

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

第3章 建造者模式(Builder Pattern)

指导者代码如下:

1第3章 建造者模式(Builder Pattern)classDirector
2第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
3第3章 建造者模式(Builder Pattern)privateConcreteBuilderbuilder;
4第3章 建造者模式(Builder Pattern)
5第3章 建造者模式(Builder Pattern)publicvoidConstruct()
6第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
7第3章 建造者模式(Builder Pattern)builder.BuildPartA();
8第3章 建造者模式(Builder Pattern)builder.BuildPartB();
9第3章 建造者模式(Builder Pattern)}
10第3章 建造者模式(Builder Pattern)}

省略指导者角色

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

第3章 建造者模式(Builder Pattern)

建造者角色代码如下:

1第3章 建造者模式(Builder Pattern)publicclassBuilder
2第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
3第3章 建造者模式(Builder Pattern)privateProductproduct=newProduct();
4第3章 建造者模式(Builder Pattern)
5第3章 建造者模式(Builder Pattern)publicvoidBuildPartA()
6第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
7第3章 建造者模式(Builder Pattern)//第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)
8第3章 建造者模式(Builder Pattern)}
9第3章 建造者模式(Builder Pattern)
10第3章 建造者模式(Builder Pattern)publicvoidBuildPartB()
11第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
12第3章 建造者模式(Builder Pattern)//第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)
13第3章 建造者模式(Builder Pattern)}
14第3章 建造者模式(Builder Pattern)
15第3章 建造者模式(Builder Pattern)publicProductGetResult()
16第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
17第3章 建造者模式(Builder Pattern)returnproduct;
18第3章 建造者模式(Builder Pattern)}
19第3章 建造者模式(Builder Pattern)
20第3章 建造者模式(Builder Pattern)publicvoidConstruct()
21第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
22第3章 建造者模式(Builder Pattern)BuildPartA();
23第3章 建造者模式(Builder Pattern)BuildPartB();
24第3章 建造者模式(Builder Pattern)}
25第3章 建造者模式(Builder Pattern)}

客户程序:
1第3章 建造者模式(Builder Pattern)publicclassClient
2第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
3第3章 建造者模式(Builder Pattern)privatestaticBuilderbuilder;
4第3章 建造者模式(Builder Pattern)
5第3章 建造者模式(Builder Pattern)publicstaticvoidMain()
6第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern)第3章 建造者模式(Builder Pattern){
7第3章 建造者模式(Builder Pattern)builder=newBuilder();
8第3章 建造者模式(Builder Pattern)builder.Construct();
9第3章 建造者模式(Builder Pattern)Productproduct=builder.GetResult();
10第3章 建造者模式(Builder Pattern)}
11第3章 建造者模式(Builder Pattern)}

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

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

第3章 建造者模式(Builder Pattern)

实现要点

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

总结

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

______________________________________________________________________________________

源程序下载:/Files/Terrylee/BuilderPattern.rar

参考资料:

《Java与设计模式》阎宏 著

《设计模式(中文版)》

《DesignPatternsExplained》

作者:TerryLee
出处:http://terrylee.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

相关文章:

  • 2022-02-10
  • 2021-12-19
  • 2021-04-27
  • 2021-08-07
猜你喜欢
  • 2021-08-08
  • 2021-12-18
  • 2022-02-18
  • 2022-12-23
相关资源
相似解决方案