快捷搜索:

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

概述

在软件系统中,无意偶尔候面临着“一个繁杂工具”的创建事情,其平日由各个部分的子工具用必然的算法构成;因为需求的变更,这个繁杂工具的各个部分常常面临着剧烈的变更,然则将它们组合在一路的算法确相对稳定。若何应对这种变更?若何供给一种“封装机制”来隔离出“繁杂工具的各个部分”的变更,从而维持系统中的“稳定构建算法”不跟着需求改变而改变?这便是要说的建造者模式。

本文经由过程现实生活中的买KFC的例子,用图解的要领来诠释建造者模式。

意图

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

模型图

生活中的例子

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

实现历程图解

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

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

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

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

产品角色:着末的套餐,所有的器械放在同一个盘子里面。

下面开始我们的买套餐历程

1.客户创建Derector工具,并用它所想要的Builder工具进行设置设置设备摆设摆设。顾客进入KFC店要买套餐,先找到一个收银员,相称于创建了一个指示者工具。这位收银员给出两种套餐供顾客选择:1通俗套餐,2黄金套餐。完成的事情如时序图中血色部分所示。

法度榜样实现:

1using System;

2using System.Configuration;

3using System.Reflection;

4

5namespace KFC

6{

7/**////

8/// Client 类

9///

10public class Client

11{

12public static void Main(string[] args)

13{

14FoodManager foodmanager = new FoodManager();

15

16Builder instance;

17

18Console.WriteLine("Please Enter Food No:");

19

20string No = Console.ReadLine();

21

22string foodType = ConfigurationSettings.AppSettings["No"+No];

23

24instance = (Builder)Assembly.Load("KFC").CreateInstance("KFC." + foodType);

25

26foodmanager.Construct(instance);

27}

28}

29}

30

产品(套餐)类:

1using System;

2using System.Collections;

3

4namespace KFC

5{

6/**////

7/// Food类,即产品类

8///

9public class Food

10{

11Hashtable food = new Hashtable();

12

13/**////

14/// 添加食物

15///

16///

食物名称

17///

价格

18public void Add(string strName,string Price)

19{

20food.Add(strName,Price);

21}

22

23/**////

24/// 显示食物清单

25///

26public void Show()

27{

28IDictionaryEnumerator myEnumerator= food.GetEnumerator();

29Console.WriteLine("Food List:");

30Console.WriteLine("------------------------------");

31string strfoodlist = "";

32while(myEnumerator.MoveNext())

33{

34strfoodlist = strfoodlist + "\n\n" + myEnumerator.Key.ToString();

35strfoodlist = strfoodlist + ":\t" +myEnumerator.Value.ToString();

36}

37Console.WriteLine(strfoodlist);

38Console.WriteLine("\n------------------------------");

39}

40}

41}

42

2.指示者看护建造器。收银员(指示者)见告餐馆员工筹备套餐。这里我们筹备套餐的顺序是:放入汉堡,可乐倒入杯中,薯条放入盒中,并把这些器械都放在盘子上。这个历程对付通俗套餐和黄金套餐来说都是一样的,不合的是它们的汉堡,可乐,薯条价格不合而已。如时序图血色部分所示:

法度榜样实现:

1using System;

2

3namespace KFC

4{

5/**////

6/// FoodManager类,即指示者

7///

8public class FoodManager

9{

10public void Construct(Builder builder)

11{

12builder.BuildHamb();

13

14builder.BuildCoke();

15

16builder.BuildChip();

17}

18}

19}

20

3.建造者处置惩罚指示者的要求,并将部件添加到产品中。餐馆员工(建造者)按照收银员要求的把对应的汉堡,可乐,薯条放入盘子中。这部分是建造者模式里面富于变更的部分,由于顾客选择的套餐不合,套餐的组装历程也不合,这步完成产品工具的创建事情。

法度榜样实现:

1using System;

2

3namespace KFC

4{

5/**////

6/// Builder类,即抽象建造者类,构造套餐

7///

8public abstract class Builder

9{

10/**////

11/// 添加汉堡

12///

13public abstract void BuildHamb();

14

15/**////

16/// 添加可乐

17///

18public abstract void BuildCoke();

19

20/**////

21/// 添加薯条

22///

23public abstract void BuildChip();

24

25/**////

26/// 返回结果

27///

28/// 食物工具

29public abstract Food GetFood();

30}

31}

32

1using System;

2

3namespace KFC

4{

5/**////

6/// NormalBuilder类,详细构造者,通俗套餐

7///

8public class NormalBuilder:Builder

9{

10private Food NormalFood = new Food();

11

12public override void BuildHamb()

13{

14NormalFood.Add("NormalHamb","¥10.50");

15}

16

17public override void BuildCoke()

18{

19NormalFood.Add("CokeCole","¥4.50");

20}

21

22public override void BuildChip()

23{

24NormalFood.Add("FireChips","¥2.00");

25}

26

27public override Food GetFood()

28{

29return NormalFood;

30}

31

32}

33}

34

1using System;

2

3namespace KFC

4{

5/**////

6/// GoldBuilder类,详细构造者,黄金套餐

7///

8public class GoldBuilder:Builder

9{

10private Food GoldFood = new Food();

11

12public override void BuildHamb()

13{

14GoldFood.Add("GoldHamb","¥13.50");

15}

16

17public override void BuildCoke()

18{

19GoldFood.Add("CokeCole","¥4.50");

20}

21

22public override void BuildChip()

23{

24GoldFood.Add("FireChips","¥3.50");

25}

26

27public override Food GetFood()

28{

29return GoldFood;

30}

31

32}

33}

34

4.客户从建造者检索产品。从餐馆员工筹备好套餐后,顾客再从餐馆员工那儿拿回套餐。这步客户法度榜样要做的仅仅是取回已经天生的产品工具,如时序图中血色部分所示。

您可能还会对下面的文章感兴趣: