EaBIM一直以来积极响应国家“十二五”推进建筑业信息化的号召,对建筑领域的信息技术开展深入技术交流和探讨!致力于打造“BIM-建筑师-生态技术”三位一体综合资源交流共享平台,希望为BIM与可持续设计理念及技术的普及做出微小的贡献!!!

EaBIM

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 6277|回复: 127
打印 上一主题 下一主题

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

[复制链接]

1514

主题

7465

帖子

1万

积分

admin

Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10

积分
12404

社区QQ达人

跳转到指定楼层
楼主
发表于 2014-1-13 17:20:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
——.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、   ……
总结
建造者模式的实质是解耦组装过程和创建具体部件,使得我们不用去关心每个部件是如何组装的。


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 转播转播 分享分享 分享淘帖 支持支持 反对反对
工作时间:工作日的9:00-12:00/13:30-18:00,节假日不在线,请勿留言
推荐
发表于 2017-5-27 09:46:17 | 只看该作者
分享是一种美德

点评

..  发表于 2017-11-8 16:23

14

主题

2892

帖子

2085

积分

BIM经理

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

积分
2085
推荐
发表于 2016-3-15 09:32:24 | 只看该作者
ヽ(✿゚▽゚)ノ 不错噢

1

主题

132

帖子

246

积分

BIM工程师

Rank: 3Rank: 3Rank: 3

积分
246

社区QQ达人

6F
发表于 2014-2-24 09:53:45 | 只看该作者
学习一下,谢谢

7

主题

888

帖子

2054

积分

BIM经理

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

积分
2054
12F
发表于 2014-6-19 11:04:00 | 只看该作者
顶......
楼下跟上.....

8

主题

792

帖子

1349

积分

BIM经理

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

积分
1349
13F
发表于 2014-6-19 11:07:14 | 只看该作者
顶......
楼下跟上.....
*滑块验证:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|EaBIM网 ( 苏ICP备2020058923号-1  苏公网安备32011502011255号

GMT+8, 2024-11-23 10:29

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表