EaBIM

标题: [设计模式] .NET设计模式(4):建造者模式(Builder Pattern) [打印本页]

作者: 萧闫子    时间: 2014-1-13 17:20
标题: [设计模式] .NET设计模式(4):建造者模式(Builder Pattern)
——.NET设计模式系列之四
Terrylee,2005年12月17日
概述
在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法确相对稳定。如何应对这种变化?如何提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持系统中的“稳定构建算法”不随着需求改变而改变?这就是要说的建造者模式。
本文通过现实生活中的买KFC的例子,用图解的方式来诠释建造者模式。
意图
将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
模型图


                               
登录/注册后可看大图

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


                               
登录/注册后可看大图

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


                               
登录/注册后可看大图

客户端:顾客。想去买一套套餐(这里面包括汉堡,可乐,薯条),可以有1号和2号两种套餐供顾客选择。
指导者角色:收银员。知道顾客想要买什么样的套餐,并告诉餐馆员工去准备套餐。
建造者角色:餐馆员工。按照收银员的要求去准备具体的套餐,分别放入汉堡,可乐,薯条等。
产品角色:最后的套餐,所有的东西放在同一个盘子里面。
下面开始我们的买套餐过程。
1.客户创建Derector对象,并用它所想要的Builder对象进行配置。顾客进入KFC店要买套餐,先找到一个收银员,相当于创建了一个指导者对象。这位收银员给出两种套餐供顾客选择:1普通套餐,2黄金套餐。完成的工作如时序图中红色部分所示。


                               
登录/注册后可看大图

程序实现:

1

                               
登录/注册后可看大图
using System;
2

                               
登录/注册后可看大图
using System.Configuration;
3

                               
登录/注册后可看大图
using System.Reflection;
4

                               
登录/注册后可看大图

5

                               
登录/注册后可看大图
namespace KFC
6

                               
登录/注册后可看大图
{
7

                               
登录/注册后可看大图
    ///
<summary>
8

                               
登录/注册后可看大图
   
/// Client 类
9

                               
登录/注册后可看大图
   
///
</summary>

10

                               
登录/注册后可看大图

public
class Client
11

                               
登录/注册后可看大图
    {
12

                               
登录/注册后可看大图
        public
static
void Main(string[] args)
13

                               
登录/注册后可看大图
        {
14

                               
登录/注册后可看大图
            FoodManager foodmanager =
new FoodManager();
15

                               
登录/注册后可看大图

16

                               
登录/注册后可看大图
            Builder instance;
17

                               
登录/注册后可看大图

18

                               
登录/注册后可看大图
            Console.WriteLine("Please Enter Food No:");
19

                               
登录/注册后可看大图

20

                               
登录/注册后可看大图
            string No = Console.ReadLine();
21

                               
登录/注册后可看大图

22

                               
登录/注册后可看大图
            string foodType = ConfigurationSettings.AppSettings["No"+No];
23

                               
登录/注册后可看大图

24

                               
登录/注册后可看大图
            instance = (Builder)Assembly.Load("KFC").CreateInstance("KFC."
+ foodType);
25

                               
登录/注册后可看大图

26

                               
登录/注册后可看大图
            foodmanager.Construct(instance);
27

                               
登录/注册后可看大图
        }
28

                               
登录/注册后可看大图
    }
29

                               
登录/注册后可看大图
}
30

                               
登录/注册后可看大图



产品(套餐)类:
1

                               
登录/注册后可看大图
using System;
2

                               
登录/注册后可看大图
using System.Collections;
3

                               
登录/注册后可看大图

4

                               
登录/注册后可看大图
namespace KFC
5

                               
登录/注册后可看大图
{
6

                               
登录/注册后可看大图
    ///
<summary>
7

                               
登录/注册后可看大图
   
/// Food类,即产品类
8

                               
登录/注册后可看大图
   
///
</summary>

9

                               
登录/注册后可看大图

public
class Food
10

                               
登录/注册后可看大图
    {
11

                               
登录/注册后可看大图
        Hashtable food =
new Hashtable();
12

                               
登录/注册后可看大图
        
13

                               
登录/注册后可看大图
        ///
<summary>
14

                               
登录/注册后可看大图
        
/// 添加食品
15

                               
登录/注册后可看大图
        
///
</summary>
16

                               
登录/注册后可看大图
        
///
<param name="strName">食品名称</param>
17

                               
登录/注册后可看大图
        
///
<param name="Price">价格</param>

18

                               
登录/注册后可看大图

public
void Add(string strName,string Price)
19

                               
登录/注册后可看大图
        {
20

                               
登录/注册后可看大图
            food.Add(strName,Price);
21

                               
登录/注册后可看大图
        }
22

                               
登录/注册后可看大图
        
23

                               
登录/注册后可看大图
        ///
<summary>
24

                               
登录/注册后可看大图
        
/// 显示食品清单
25

                               
登录/注册后可看大图
        
///
</summary>

26

                               
登录/注册后可看大图

public
void Show()
27

                               
登录/注册后可看大图
        {
28

                               
登录/注册后可看大图
            IDictionaryEnumerator myEnumerator  = food.GetEnumerator();
29

                               
登录/注册后可看大图
            Console.WriteLine("Food List:");
30

                               
登录/注册后可看大图
            Console.WriteLine("------------------------------");
31

                               
登录/注册后可看大图
            string strfoodlist =
"";
32

                               
登录/注册后可看大图
            while(myEnumerator.MoveNext())
33

                               
登录/注册后可看大图
            {
34

                               
登录/注册后可看大图
                strfoodlist = strfoodlist +
"\n\n"
+ myEnumerator.Key.ToString();
35

                               
登录/注册后可看大图
                strfoodlist = strfoodlist +
":\t"
+myEnumerator.Value.ToString();
36

                               
登录/注册后可看大图
            }
37

                               
登录/注册后可看大图
            Console.WriteLine(strfoodlist);
38

                               
登录/注册后可看大图
            Console.WriteLine("\n------------------------------");
39

                               
登录/注册后可看大图
        }
40

                               
登录/注册后可看大图
    }
41

                               
登录/注册后可看大图
}
42

                               
登录/注册后可看大图

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


                               
登录/注册后可看大图

程序实现:

1

                               
登录/注册后可看大图
using System;
2

                               
登录/注册后可看大图

3

                               
登录/注册后可看大图
namespace KFC
4

                               
登录/注册后可看大图
{
5

                               
登录/注册后可看大图
    ///
<summary>
6

                               
登录/注册后可看大图
   
/// FoodManager类,即指导者
7

                               
登录/注册后可看大图
   
///
</summary>

8

                               
登录/注册后可看大图

public
class FoodManager
9

                               
登录/注册后可看大图
    {
10

                               
登录/注册后可看大图
        public
void Construct(Builder builder)
11

                               
登录/注册后可看大图
        {
12

                               
登录/注册后可看大图
            builder.BuildHamb();
13

                               
登录/注册后可看大图

14

                               
登录/注册后可看大图
            builder.BuildCoke();
15

                               
登录/注册后可看大图

16

                               
登录/注册后可看大图
            builder.BuildChip();
17

                               
登录/注册后可看大图
        }
18

                               
登录/注册后可看大图
    }
19

                               
登录/注册后可看大图
}
20

                               
登录/注册后可看大图


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

1

                               
登录/注册后可看大图
using System;
2

                               
登录/注册后可看大图

3

                               
登录/注册后可看大图
namespace KFC
4

                               
登录/注册后可看大图
{
5

                               
登录/注册后可看大图
    ///
<summary>
6

                               
登录/注册后可看大图
   
/// Builder类,即抽象建造者类,构造套餐
7

                               
登录/注册后可看大图
   
///
</summary>

8

                               
登录/注册后可看大图

public
abstract
class Builder
9

                               
登录/注册后可看大图
    {   
10

                               
登录/注册后可看大图
        ///
<summary>
11

                               
登录/注册后可看大图
        
/// 添加汉堡
12

                               
登录/注册后可看大图
        
///
</summary>

13

                               
登录/注册后可看大图

public
abstract
void BuildHamb();
14

                               
登录/注册后可看大图
        
15

                               
登录/注册后可看大图
        ///
<summary>
16

                               
登录/注册后可看大图
        
/// 添加可乐
17

                               
登录/注册后可看大图
        
///
</summary>

18

                               
登录/注册后可看大图

public
abstract
void BuildCoke();
19

                               
登录/注册后可看大图
        
20

                               
登录/注册后可看大图
        ///
<summary>
21

                               
登录/注册后可看大图
        
/// 添加薯条
22

                               
登录/注册后可看大图
        
///
</summary>

23

                               
登录/注册后可看大图

public
abstract
void BuildChip();
24

                               
登录/注册后可看大图
        
25

                               
登录/注册后可看大图
        ///
<summary>
26

                               
登录/注册后可看大图
        
/// 返回结果
27

                               
登录/注册后可看大图
        
///
</summary>
28

                               
登录/注册后可看大图
        
///
<returns>食品对象</returns>

29

                               
登录/注册后可看大图

public
abstract Food GetFood();
30

                               
登录/注册后可看大图
    }
31

                               
登录/注册后可看大图
}
32

                               
登录/注册后可看大图


1

                               
登录/注册后可看大图
using System;
2

                               
登录/注册后可看大图

3

                               
登录/注册后可看大图
namespace KFC
4

                               
登录/注册后可看大图
{
5

                               
登录/注册后可看大图
    ///
<summary>
6

                               
登录/注册后可看大图
   
/// NormalBuilder类,具体构造者,普通套餐
7

                               
登录/注册后可看大图
   
///
</summary>

8

                               
登录/注册后可看大图

public
class NormalBuilder:Builder
9

                               
登录/注册后可看大图
    {
10

                               
登录/注册后可看大图
        private Food NormalFood =
new Food();
11

                               
登录/注册后可看大图

12

                               
登录/注册后可看大图
        public
override
void BuildHamb()
13

                               
登录/注册后可看大图
        {
14

                               
登录/注册后可看大图
            NormalFood.Add("NormalHamb","¥10.50");
15

                               
登录/注册后可看大图
        }
16

                               
登录/注册后可看大图
        
17

                               
登录/注册后可看大图
        public
override
void BuildCoke()
18

                               
登录/注册后可看大图
        {
19

                               
登录/注册后可看大图
            NormalFood.Add("CokeCole","¥4.50");
20

                               
登录/注册后可看大图
        }
21

                               
登录/注册后可看大图

22

                               
登录/注册后可看大图
        public
override
void BuildChip()
23

                               
登录/注册后可看大图
        {
24

                               
登录/注册后可看大图
            NormalFood.Add("FireChips","¥2.00");
25

                               
登录/注册后可看大图
        }
26

                               
登录/注册后可看大图

27

                               
登录/注册后可看大图
        public
override Food GetFood()
28

                               
登录/注册后可看大图
        {
29

                               
登录/注册后可看大图
            return NormalFood;
30

                               
登录/注册后可看大图
        }
31

                               
登录/注册后可看大图

32

                               
登录/注册后可看大图
    }
33

                               
登录/注册后可看大图
}
34

                               
登录/注册后可看大图


1

                               
登录/注册后可看大图
using System;
2

                               
登录/注册后可看大图

3

                               
登录/注册后可看大图
namespace KFC
4

                               
登录/注册后可看大图
{
5

                               
登录/注册后可看大图
    ///
<summary>
6

                               
登录/注册后可看大图
   
/// GoldBuilder类,具体构造者,黄金套餐
7

                               
登录/注册后可看大图
   
///
</summary>

8

                               
登录/注册后可看大图

public
class GoldBuilder:Builder
9

                               
登录/注册后可看大图
    {
10

                               
登录/注册后可看大图
        private Food GoldFood =
new Food();
11

                               
登录/注册后可看大图

12

                               
登录/注册后可看大图
        public
override
void BuildHamb()
13

                               
登录/注册后可看大图
        {
14

                               
登录/注册后可看大图
            GoldFood.Add("GoldHamb","¥13.50");
15

                               
登录/注册后可看大图
        }
16

                               
登录/注册后可看大图
        
17

                               
登录/注册后可看大图
        public
override
void BuildCoke()
18

                               
登录/注册后可看大图
        {
19

                               
登录/注册后可看大图
            GoldFood.Add("CokeCole","¥4.50");
20

                               
登录/注册后可看大图
        }
21

                               
登录/注册后可看大图

22

                               
登录/注册后可看大图
        public
override
void BuildChip()
23

                               
登录/注册后可看大图
        {
24

                               
登录/注册后可看大图
            GoldFood.Add("FireChips","¥3.50");
25

                               
登录/注册后可看大图
        }
26

                               
登录/注册后可看大图

27

                               
登录/注册后可看大图
        public
override Food GetFood()
28

                               
登录/注册后可看大图
        {
29

                               
登录/注册后可看大图
            return GoldFood;
30

                               
登录/注册后可看大图
        }
31

                               
登录/注册后可看大图

32

                               
登录/注册后可看大图
    }
33

                               
登录/注册后可看大图
}
34

                               
登录/注册后可看大图



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


                               
登录/注册后可看大图

完整的客户程序:

1

                               
登录/注册后可看大图
using System;
2

                               
登录/注册后可看大图
using System.Configuration;
3

                               
登录/注册后可看大图
using System.Reflection;
4

                               
登录/注册后可看大图

5

                               
登录/注册后可看大图
namespace KFC
6

                               
登录/注册后可看大图
{
7

                               
登录/注册后可看大图
    ///
<summary>
8

                               
登录/注册后可看大图
   
/// Client 类
9

                               
登录/注册后可看大图
   
///
</summary>

10

                               
登录/注册后可看大图

public
class Client
11

                               
登录/注册后可看大图
    {
12

                               
登录/注册后可看大图
        public
static
void Main(string[] args)
13

                               
登录/注册后可看大图
        {
14

                               
登录/注册后可看大图
            FoodManager foodmanager =
new FoodManager();
15

                               
登录/注册后可看大图

16

                               
登录/注册后可看大图
            Builder instance;
17

                               
登录/注册后可看大图

18

                               
登录/注册后可看大图
            Console.WriteLine("Please Enter Food No:");
19

                               
登录/注册后可看大图

20

                               
登录/注册后可看大图
            string No = Console.ReadLine();
21

                               
登录/注册后可看大图

22

                               
登录/注册后可看大图
            string foodType = ConfigurationSettings.AppSettings["No"+No];
23

                               
登录/注册后可看大图

24

                               
登录/注册后可看大图
            instance = (Builder)Assembly.Load("KFC").CreateInstance("KFC."
+ foodType);
25

                               
登录/注册后可看大图

26

                               
登录/注册后可看大图
            foodmanager.Construct(instance);
27

                               
登录/注册后可看大图

28

                               
登录/注册后可看大图
            Food food = instance.GetFood();
29

                               
登录/注册后可看大图
            food.Show();
30

                               
登录/注册后可看大图

31

                               
登录/注册后可看大图
            Console.ReadLine();
32

                               
登录/注册后可看大图
        }
33

                               
登录/注册后可看大图
    }
34

                               
登录/注册后可看大图
}
35

                               
登录/注册后可看大图


通过分析不难看出,在这个例子中,在准备套餐的过程是稳定的,即按照一定的步骤去做,而套餐的组成部分则是变化的,有可能是普通套餐或黄金套餐等。这个变化就是建造者模式中的“变化点“,就是我们要封装的部分。
另外一个例子
在这里我们再给出另外一个关于建造房子的例子。客户程序通过调用指导者 (CDirector class)的BuildHouse()方法来创建一个房子。该方法有一个布尔型的参数blnBackyard,当blnBackyard为假时指导者将创建一个Apartment(Concrete Builder),当它为真时将创建一个Single Family Home(Concrete Builder)。这两种房子都实现了接口Ihouse。
程序实现:

  1

                               
登录/注册后可看大图
//关于建造房屋的例子
  2

                               
登录/注册后可看大图
using System;
  3

                               
登录/注册后可看大图
using System.Collections;
  4

                               
登录/注册后可看大图

  5

                               
登录/注册后可看大图
///
<summary>
  6

                               
登录/注册后可看大图
/// 抽象建造者
  7

                               
登录/注册后可看大图
///
</summary>

  8

                               
登录/注册后可看大图
public
interface IHouse
  9

                               
登录/注册后可看大图
{
10

                               
登录/注册后可看大图
    bool GetBackyard();
11

                               
登录/注册后可看大图
    long NoOfRooms();
12

                               
登录/注册后可看大图
    string  Description();
13

                               
登录/注册后可看大图
}
14

                               
登录/注册后可看大图

15

                               
登录/注册后可看大图
///
<summary>
16

                               
登录/注册后可看大图
/// 具体建造者
17

                               
登录/注册后可看大图
///
</summary>

18

                               
登录/注册后可看大图
public
class CApt:IHouse
19

                               
登录/注册后可看大图
{
20

                               
登录/注册后可看大图
    private
bool mblnBackyard;
21

                               
登录/注册后可看大图
    private Hashtable Rooms;
22

                               
登录/注册后可看大图
    public CApt()
23

                               
登录/注册后可看大图
    {
24

                               
登录/注册后可看大图
        CRoom room;   
25

                               
登录/注册后可看大图
        Rooms =
new Hashtable();
26

                               
登录/注册后可看大图
        room =
new CRoom();
27

                               
登录/注册后可看大图
        room.RoomName =
"Master Bedroom";
28

                               
登录/注册后可看大图
        Rooms.Add ("room1",room);
29

                               
登录/注册后可看大图

30

                               
登录/注册后可看大图
        room =
new CRoom();
31

                               
登录/注册后可看大图
        room.RoomName =
"Second Bedroom";
32

                               
登录/注册后可看大图
        Rooms.Add ("room2",room);
33

                               
登录/注册后可看大图

34

                               
登录/注册后可看大图
        room =
new CRoom();
35

                               
登录/注册后可看大图
        room.RoomName =
"Living Room";
36

                               
登录/注册后可看大图
        Rooms.Add ("room3",room);
37

                               
登录/注册后可看大图
        
38

                               
登录/注册后可看大图
        mblnBackyard =
false;
39

                               
登录/注册后可看大图
    }
40

                               
登录/注册后可看大图

41

                               
登录/注册后可看大图
    public
bool GetBackyard()
42

                               
登录/注册后可看大图
    {
43

                               
登录/注册后可看大图
        return mblnBackyard;
44

                               
登录/注册后可看大图
    }
45

                               
登录/注册后可看大图
    public
long NoOfRooms()
46

                               
登录/注册后可看大图
    {
47

                               
登录/注册后可看大图
        return Rooms.Count;
48

                               
登录/注册后可看大图
    }
49

                               
登录/注册后可看大图
    public
string  Description()
50

                               
登录/注册后可看大图
    {
51

                               
登录/注册后可看大图
        IDictionaryEnumerator myEnumerator  = Rooms.GetEnumerator();
52

                               
登录/注册后可看大图
        string strDescription;
53

                               
登录/注册后可看大图
        strDescription =
"This is an Apartment with "
+ Rooms.Count +
" Rooms \n";
54

                               
登录/注册后可看大图
        strDescription = strDescription +
"This Apartment doesn't have a backyard \n";                        
55

                               
登录/注册后可看大图
        while (myEnumerator.MoveNext())
56

                               
登录/注册后可看大图
        {
57

                               
登录/注册后可看大图
            strDescription = strDescription +
"\n"
+ myEnumerator.Key +
"\t"
+ ((CRoom)myEnumerator.Value).RoomName;
58

                               
登录/注册后可看大图
        }
59

                               
登录/注册后可看大图
        return strDescription;
60

                               
登录/注册后可看大图
    }
61

                               
登录/注册后可看大图
}
62

                               
登录/注册后可看大图

63

                               
登录/注册后可看大图
///
<summary>
64

                               
登录/注册后可看大图
/// 具体建造者
65

                               
登录/注册后可看大图
///
</summary>

66

                               
登录/注册后可看大图
public
class CSFH:IHouse
67

                               
登录/注册后可看大图
{
68

                               
登录/注册后可看大图
    private
bool mblnBackyard;
69

                               
登录/注册后可看大图
    private Hashtable Rooms;
70

                               
登录/注册后可看大图
    public CSFH()
71

                               
登录/注册后可看大图
    {
72

                               
登录/注册后可看大图
        CRoom room;
73

                               
登录/注册后可看大图
        Rooms =
new Hashtable();
74

                               
登录/注册后可看大图

75

                               
登录/注册后可看大图
        room =
new CRoom();
76

                               
登录/注册后可看大图
        room.RoomName =
"Master Bedroom";
77

                               
登录/注册后可看大图
        Rooms.Add ("room1",room);
78

                               
登录/注册后可看大图

79

                               
登录/注册后可看大图
        room =
new CRoom();
80

                               
登录/注册后可看大图
        room.RoomName =
"Second Bedroom";
81

                               
登录/注册后可看大图
        Rooms.Add ("room2",room);
82

                               
登录/注册后可看大图

83

                               
登录/注册后可看大图
        room =
new CRoom();
84

                               
登录/注册后可看大图
        room.RoomName =
"Third Room";
85

                               
登录/注册后可看大图
        Rooms.Add ("room3",room);
86

                               
登录/注册后可看大图
        
87

                               
登录/注册后可看大图
        room =
new CRoom();
88

                               
登录/注册后可看大图
        room.RoomName =
"Living Room";
89

                               
登录/注册后可看大图
        Rooms.Add ("room4",room);
90

                               
登录/注册后可看大图

91

                               
登录/注册后可看大图
        room =
new CRoom();
92

                               
登录/注册后可看大图
        room.RoomName =
"Guest Room";
93

                               
登录/注册后可看大图
        Rooms.Add ("room5",room);
94

                               
登录/注册后可看大图

95

                               
登录/注册后可看大图
        mblnBackyard =
true;
96

                               
登录/注册后可看大图

97

                               
登录/注册后可看大图
    }
98

                               
登录/注册后可看大图

99

                               
登录/注册后可看大图
    public
bool GetBackyard()
100

                               
登录/注册后可看大图
    {
101

                               
登录/注册后可看大图
        return mblnBackyard;
102

                               
登录/注册后可看大图
    }
103

                               
登录/注册后可看大图
    public
long NoOfRooms()
104

                               
登录/注册后可看大图
    {
105

                               
登录/注册后可看大图
        return Rooms.Count;
106

                               
登录/注册后可看大图
    }
107

                               
登录/注册后可看大图
    public
string  Description()
108

                               
登录/注册后可看大图
    {
109

                               
登录/注册后可看大图
        IDictionaryEnumerator myEnumerator  = Rooms.GetEnumerator();
110

                               
登录/注册后可看大图
        string strDescription;
111

                               
登录/注册后可看大图
        strDescription =
"This is an Single Family Home with "
+ Rooms.Count +
" Rooms \n";
112

                               
登录/注册后可看大图
        strDescription = strDescription +
"This house has a backyard \n";
113

                               
登录/注册后可看大图
        while (myEnumerator.MoveNext())
114

                               
登录/注册后可看大图
        {
115

                               
登录/注册后可看大图
            strDescription = strDescription +
"\n"
+ myEnumerator.Key +
"\t"
+ ((CRoom)myEnumerator.Value).RoomName;
116

                               
登录/注册后可看大图
        }
117

                               
登录/注册后可看大图
        return strDescription;
118

                               
登录/注册后可看大图
    }
119

                               
登录/注册后可看大图
}
120

                               
登录/注册后可看大图

121

                               
登录/注册后可看大图
public
interface IRoom
122

                               
登录/注册后可看大图
{
123

                               
登录/注册后可看大图
    string RoomName{get;set;}
124

                               
登录/注册后可看大图
}
125

                               
登录/注册后可看大图

126

                               
登录/注册后可看大图
public
class CRoom:IRoom
127

                               
登录/注册后可看大图
{
128

                               
登录/注册后可看大图
    private
string mstrRoomName;
129

                               
登录/注册后可看大图
    public
string RoomName
130

                               
登录/注册后可看大图
    {
131

                               
登录/注册后可看大图
        get
132

                               
登录/注册后可看大图
        {
133

                               
登录/注册后可看大图
            return mstrRoomName;
134

                               
登录/注册后可看大图
        }
135

                               
登录/注册后可看大图
        set
136

                               
登录/注册后可看大图
        {
137

                               
登录/注册后可看大图
            mstrRoomName = value;
138

                               
登录/注册后可看大图
        }
139

                               
登录/注册后可看大图
    }
140

                               
登录/注册后可看大图
}
141

                               
登录/注册后可看大图

142

                               
登录/注册后可看大图
///
<summary>
143

                               
登录/注册后可看大图
/// 指导者
144

                               
登录/注册后可看大图
///
</summary>

145

                               
登录/注册后可看大图
public
class CDirector
146

                               
登录/注册后可看大图
{
147

                               
登录/注册后可看大图
    public IHouse BuildHouse(bool blnBackyard)
148

                               
登录/注册后可看大图
    {
149

                               
登录/注册后可看大图
        if (blnBackyard)
150

                               
登录/注册后可看大图
        {
151

                               
登录/注册后可看大图
            return
new CSFH();
152

                               
登录/注册后可看大图
        }
153

                               
登录/注册后可看大图
        else
154

                               
登录/注册后可看大图
        {
155

                               
登录/注册后可看大图
            return
new CApt();
156

                               
登录/注册后可看大图
        }
157

                               
登录/注册后可看大图
    }
158

                               
登录/注册后可看大图
}
159

                               
登录/注册后可看大图

160

                               
登录/注册后可看大图
///
<summary>
161

                               
登录/注册后可看大图
/// 客户程序
162

                               
登录/注册后可看大图
///
</summary>

163

                               
登录/注册后可看大图
public
class Client
164

                               
登录/注册后可看大图
{
165

                               
登录/注册后可看大图
    static
void Main(string[] args)
166

                               
登录/注册后可看大图
    {
167

                               
登录/注册后可看大图
        CDirector objDirector =
new CDirector();
168

                               
登录/注册后可看大图
        IHouse objHouse;
169

                               
登录/注册后可看大图

170

                               
登录/注册后可看大图
        string Input = Console.ReadLine();
171

                               
登录/注册后可看大图
        objHouse = objDirector.BuildHouse(bool.Parse(Input));
172

                               
登录/注册后可看大图
   
173

                               
登录/注册后可看大图
        Console.WriteLine(objHouse.Description());
174

                               
登录/注册后可看大图
        Console.ReadLine();
175

                               
登录/注册后可看大图
    }
176

                               
登录/注册后可看大图
}
177

                               
登录/注册后可看大图

178

                               
登录/注册后可看大图


建造者模式的几种演化
省略抽象建造者角色
系统中只需要一个具体建造者,省略掉抽象建造者,结构图如下:


                               
登录/注册后可看大图

指导者代码如下:

1

                               
登录/注册后可看大图

class Director
2

                               
登录/注册后可看大图
  {
3

                               
登录/注册后可看大图
   private ConcreteBuilder builder;
4

                               
登录/注册后可看大图

5

                               
登录/注册后可看大图
   public
void Construct()
6

                               
登录/注册后可看大图
    {
7

                               
登录/注册后可看大图
     builder.BuildPartA();
8

                               
登录/注册后可看大图
     builder.BuildPartB();
9

                               
登录/注册后可看大图
   }
10

                               
登录/注册后可看大图
}


省略指导者角色

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


                               
登录/注册后可看大图

建造者角色代码如下:

1

                               
登录/注册后可看大图

public
class Builder
2

                               
登录/注册后可看大图
  {
3

                               
登录/注册后可看大图
   private Product product =
new Product();
4

                               
登录/注册后可看大图

5

                               
登录/注册后可看大图
   public
void BuildPartA()
6

                               
登录/注册后可看大图
    {
7

                               
登录/注册后可看大图
     //

                               
登录/注册后可看大图

                               
登录/注册后可看大图

8

                               
登录/注册后可看大图
   }
9

                               
登录/注册后可看大图

10

                               
登录/注册后可看大图
   public
void BuildPartB()
11

                               
登录/注册后可看大图
    {
12

                               
登录/注册后可看大图
     //

                               
登录/注册后可看大图

                               
登录/注册后可看大图

13

                               
登录/注册后可看大图
   }
14

                               
登录/注册后可看大图

15

                               
登录/注册后可看大图
   public Product GetResult()
16

                               
登录/注册后可看大图
    {
17

                               
登录/注册后可看大图
     return product;
18

                               
登录/注册后可看大图
   }
19

                               
登录/注册后可看大图

20

                               
登录/注册后可看大图
   public
void Construct()
21

                               
登录/注册后可看大图
    {
22

                               
登录/注册后可看大图
     BuildPartA();
23

                               
登录/注册后可看大图
     BuildPartB();
24

                               
登录/注册后可看大图
   }
25

                               
登录/注册后可看大图
}


客户程序:
1

                               
登录/注册后可看大图

public
class Client
2

                               
登录/注册后可看大图
  {
3

                               
登录/注册后可看大图
   private
static Builder builder;
4

                               
登录/注册后可看大图

5

                               
登录/注册后可看大图
   public
static
void Main()
6

                               
登录/注册后可看大图
    {
7

                               
登录/注册后可看大图
     builder =
new Builder();
8

                               
登录/注册后可看大图
     builder.Construct();
9

                               
登录/注册后可看大图
     Product product = builder.GetResult();
10

                               
登录/注册后可看大图
   }
11

                               
登录/注册后可看大图
}



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


                               
登录/注册后可看大图

实现要点
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、   ……
总结
建造者模式的实质是解耦组装过程和创建具体部件,使得我们不用去关心每个部件是如何组装的。



作者: MIMDxFzL    时间: 2014-2-13 10:29

作者: 等你回来    时间: 2014-2-19 14:57
顶!!!!!!!!!!
作者: 挚诚星1    时间: 2014-2-24 09:53
学习一下,谢谢
作者: 蓝天POLO    时间: 2014-2-26 13:40
顶!!!!!!!!!!
作者: 冰雨    时间: 2014-6-13 13:56
顶!!!!!!!!!!!!!!!!!!!!!!!!!
作者: 筱雅    时间: 2014-6-13 14:01
顶起来…………
作者: xy666    时间: 2014-6-13 14:04
顶!!!!!!!!!!
作者: 爬爬``PA    时间: 2014-6-19 10:58
路过!!!
帮顶……
作者: 順順    时间: 2014-6-19 11:04
顶......
楼下跟上.....
作者: zj1345    时间: 2014-6-19 11:07
顶......
楼下跟上.....
作者: 萧闫子    时间: 2014-7-2 10:56
学习学习
作者: 萧闫子    时间: 2014-7-10 09:10
感谢分享
作者: 代号蓝牙    时间: 2014-7-14 14:57
感谢分享
作者: 萧闫子    时间: 2014-7-22 10:07
hahaha
作者: 萧闫子    时间: 2014-7-23 10:09
感谢分享
作者: 萧闫子    时间: 2014-9-29 09:24
感谢分享
作者: 鹦鹉仔    时间: 2014-10-22 11:21
(*^__^*) 嘻嘻……
作者: 风吹枫落    时间: 2014-10-22 11:21
顶起来…………
作者: 宇航员    时间: 2014-10-22 11:21
顶起来…………
作者: 影馨    时间: 2014-10-22 11:21
路过!!!
帮顶……
作者: chen_0003    时间: 2014-10-22 11:21
路过!!!
不发表意见……
作者: JHXT杰西卡    时间: 2014-10-22 11:22
(*^__^*) 嘻嘻……
作者: 冰山    时间: 2014-10-22 11:22
顶起来…………
作者: OK佬    时间: 2014-10-22 11:22
(*^__^*) 嘻嘻……
作者: 順順    时间: 2014-10-22 11:22
(*^__^*) 嘻嘻……
作者: 车奴    时间: 2014-10-22 11:23
顶!!!!!!!!!!
作者: 烈火ivk    时间: 2014-10-22 11:23
顶!!!!!!!!!!
作者: 欧宝    时间: 2014-10-22 11:23
顶起来…………
作者: levin    时间: 2014-10-22 11:24
顶......
楼下跟上.....
作者: 宇航员    时间: 2014-10-22 11:24
顶起来…………
作者: 冰山    时间: 2014-10-22 11:25
顶......
楼下跟上.....
作者: 龙龙..!    时间: 2014-10-22 11:25
顶起来…………
作者: 毫半字    时间: 2014-10-22 11:25
顶起来…………
作者: 江枫    时间: 2014-10-22 11:26
路过!!!
不发表意见……
作者: 严英华    时间: 2014-10-22 11:26
顶......
楼下跟上.....
作者: 莞人莞事    时间: 2014-10-22 11:26
顶起来…………
作者: 波罗友    时间: 2014-10-22 11:27
顶起来…………
作者: dgren    时间: 2014-10-22 11:27
顶!!!!!!!!!!!!!!!!!!!!!!!!!
作者: 卡巴kala    时间: 2014-10-22 11:28
路过!!!
不发表意见……
作者: dgren    时间: 2014-10-22 11:28
顶!!!!!!!!!!!!!!!!!!!!!!!!!
作者: 蓝天POLO    时间: 2014-10-22 11:28
顶起来…………
作者: 一梦千寻    时间: 2014-10-22 11:29
顶!!!!!!!!!!
作者: 楚客    时间: 2014-10-22 11:29
路过!!!
帮顶……
作者: ★の风の☆    时间: 2014-10-22 11:29
路过!!!
帮顶……
作者: 影馨    时间: 2014-10-22 11:30
顶起来…………
作者: MIMDxFzL    时间: 2014-10-22 11:30
路过!!!
帮顶……
作者: zj1345    时间: 2014-10-22 11:30
顶!!!!!!!!!!
作者: 孙雅    时间: 2014-10-22 11:30
(*^__^*) 嘻嘻……
作者: 入樽    时间: 2014-10-22 11:30
顶!!!!!!!!!!
作者: 元劭    时间: 2014-10-22 11:31
顶!!!!!!!!!!!!!!!!!!!!!!!!!
作者: 教父    时间: 2014-10-22 11:31
顶!!!!!!!!!!!!!!!!!!!!!!!!!
作者: 卡巴kala    时间: 2014-10-22 11:31
顶!!!!!!!!!!!!!!!!!!!!!!!!!
作者: 开始了d    时间: 2014-10-22 11:32
顶!!!!!!!!!!
作者: 猫猫girl    时间: 2014-10-22 11:32
顶!!!!!!!!!!
作者: 沧海冷月    时间: 2014-10-22 11:32
(*^__^*) 嘻嘻……
作者: 飞天舞    时间: 2014-10-22 11:32
(*^__^*) 嘻嘻……
作者: 鹦鹉仔    时间: 2014-10-22 11:33
顶起来…………
作者: 看看侃侃    时间: 2014-10-22 11:33
顶......
楼下跟上.....
作者: 车晶晶    时间: 2014-10-22 11:33
(*^__^*) 嘻嘻……
作者: 等你回来    时间: 2014-10-22 11:34
顶起来…………
作者: ★の风の☆    时间: 2014-10-22 11:34
路过!!!
不发表意见……
作者: 车晶晶    时间: 2014-10-22 11:35
路过!!!
帮顶……
作者: 长风    时间: 2014-10-22 11:35
(*^__^*) 嘻嘻……
作者: 冰山    时间: 2014-10-22 11:35
(*^__^*) 嘻嘻……
作者: lw7511    时间: 2014-10-22 11:36
顶起来…………
作者: leowave    时间: 2014-10-22 11:36
顶......
楼下跟上.....
作者: 順順    时间: 2014-10-22 11:36
(*^__^*) 嘻嘻……
作者: zj1345    时间: 2014-10-22 11:37
顶!!!!!!!!!!
作者: 等你回来    时间: 2014-10-22 11:37
顶!!!!!!!!!!
作者: 矮矮    时间: 2014-10-22 11:38
(*^__^*) 嘻嘻……
作者: 黑超BB    时间: 2014-10-22 11:38
顶......
楼下跟上.....
作者: 順順    时间: 2014-10-22 11:39
顶!!!!!!!!!!
作者: 等你回来    时间: 2014-10-22 11:39
顶!!!!!!!!!!
作者: 极HONDA速    时间: 2014-10-22 11:40
(*^__^*) 嘻嘻……
作者: codywu    时间: 2014-10-22 11:40
顶起来…………
作者: 茶神idg    时间: 2014-10-22 11:40
顶......
楼下跟上.....
作者: 飞天舞    时间: 2014-10-22 11:41
(*^__^*) 嘻嘻……
作者: 慕容柔晴    时间: 2014-10-22 11:41
路过!!!
帮顶……
作者: 欧宝    时间: 2014-10-22 11:41
路过!!!
不发表意见……
作者: 元劭    时间: 2014-10-22 11:42
路过!!!
帮顶……
作者: 风浪子    时间: 2014-10-22 11:42
(*^__^*) 嘻嘻……
作者: 元劭    时间: 2014-10-22 11:43
顶!!!!!!!!!!!!!!!!!!!!!!!!!
作者: 卡巴kala    时间: 2014-10-22 11:43
路过!!!
不发表意见……
作者: AK47    时间: 2014-10-22 11:43
顶起来…………
作者: 莞人莞事    时间: 2014-10-22 11:43
顶起来…………
作者: 順順    时间: 2014-10-22 11:44
路过!!!
帮顶……
作者: 鹦鹉仔    时间: 2014-10-22 11:44
顶!!!!!!!!!!!!!!!!!!!!!!!!!
作者: 木鬼    时间: 2014-10-22 11:44
路过!!!
不发表意见……
作者: leowave    时间: 2014-10-22 11:45
顶!!!!!!!!!!!!!!!!!!!!!!!!!
作者: best    时间: 2014-10-22 11:45
路过!!!
不发表意见……
作者: 苦田辛君    时间: 2014-10-22 11:45
顶......
楼下跟上.....
作者: dgren    时间: 2014-10-22 11:45
顶......
楼下跟上.....
作者: 順順    时间: 2014-10-22 11:46
顶!!!!!!!!!!!!!!!!!!!!!!!!!
作者: 悠悠筱荷    时间: 2014-12-8 11:06
路过
作者: 萧闫子    时间: 2014-12-17 10:01
感谢分享
作者: EaBIM门户编辑    时间: 2015-6-5 09:21
顶!!
作者: EaBIM门户编辑    时间: 2015-6-12 09:58
顶!
作者: 萧闫子    时间: 2015-6-28 14:43
感谢分享
作者: EaBIM门户编辑    时间: 2015-7-27 10:18
很好哦!




欢迎光临 EaBIM (https://eabim.net/) Powered by Discuz! X3.2