您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > 建造者模式过程图解(BuilderPattern)
建造者模式过程图解(BuilderPattern)——探索设计模式系列之四Terrylee,2005年12月17日概述在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法确相对稳定。如何应对这种变化?如何提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持系统中的“稳定构建算法”不随着需求改变而改变?这就是要说的建造者模式。本文通过现实生活中的买KFC的例子,用图解的方式来诠释建造者模式。意图将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。模型图生活中的例子生成器模式将复杂对象的构建与对象的表现分离开来,这样使得同样的构建过程可以创建出不同的表现。这种模式用于快餐店制作儿童餐。典型的儿童餐包括一个主食,一个辅食,一杯饮料和一个玩具(例如汉堡、炸鸡、可乐和玩具车)。这些在不同的儿童餐中可以是不同的,但是组合成儿童餐的过程是相同的。无论顾客点的是汉堡,三名治还是鸡肉,过程都是一样的。柜台的员工直接把主食,辅食和玩具放在一起。这些是放在一个袋子中的。饮料被倒入杯中,放在袋子外边。这些过程在相互竞争的餐馆中是同样的。实现过程图解在这里我们还是以去KFC店买套餐为例子,示意图如下:客户端:顾客。想去买一套套餐(这里面包括汉堡,可乐,薯条),可以有1号和2号两种套餐供顾客选择。指导者角色:收银员。知道顾客想要买什么样的套餐,并告诉餐馆员工去准备套餐。建造者角色:餐馆员工。按照收银员的要求去准备具体的套餐,分别放入汉堡,可乐,薯条等。产品角色:最后的套餐,所有的东西放在同一个盘子里面。下面开始我们的买套餐过程。1.客户创建Derector对象,并用它所想要的Builder对象进行配置。顾客进入KFC店要买套餐,先找到一个收银员,相当于创建了一个指导者对象。这位收银员给出两种套餐供顾客选择:1普通套餐,2黄金套餐。完成的工作如时序图中红色部分所示。程序实现:1usingSystem;2usingSystem.Configuration;3usingSystem.Reflection;45namespaceKFC6{7///summary8///Client类9////summary10publicclassClient11{12publicstaticvoidMain(string[]args)13{14FoodManagerfoodmanager=newFoodManager();1516Builderinstance;1718Console.WriteLine(PleaseEnterFoodNo:);1920stringNo=Console.ReadLine();2122stringfoodType=ConfigurationSettings.AppSettings[No+No];2324instance=(Builder)Assembly.Load(KFC).CreateInstance(KFC.+foodType);2526foodmanager.Construct(instance);27}28}29}30产品(套餐)类:1usingSystem;2usingSystem.Collections;34namespaceKFC5{6///summary7///Food类,即产品类8////summary9publicclassFood10{11Hashtablefood=newHashtable();1213///summary14///添加食品15////summary16///paramname=strName食品名称/param17///paramname=Price价格/param18publicvoidAdd(stringstrName,stringPrice)19{20food.Add(strName,Price);21}2223///summary24///显示食品清单25////summary26publicvoidShow()27{28IDictionaryEnumeratormyEnumerator=food.GetEnumerator();29Console.WriteLine(FoodList:);30Console.WriteLine(------------------------------);31stringstrfoodlist=;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}422.指导者通知建造器。收银员(指导者)告知餐馆员工准备套餐。这里我们准备套餐的顺序是:放入汉堡,可乐倒入杯中,薯条放入盒中,并把这些东西都放在盘子上。这个过程对于普通套餐和黄金套餐来说都是一样的,不同的是它们的汉堡,可乐,薯条价格不同而已。如时序图红色部分所示:程序实现:1usingSystem;23namespaceKFC4{5///summary6///FoodManager类,即指导者7////summary8publicclassFoodManager9{10publicvoidConstruct(Builderbuilder)11{12builder.BuildHamb();1314builder.BuildCoke();1516builder.BuildChip();17}18}19}203.建造者处理指导者的要求,并将部件添加到产品中。餐馆员工(建造者)按照收银员要求的把对应的汉堡,可乐,薯条放入盘子中。这部分是建造者模式里面富于变化的部分,因为顾客选择的套餐不同,套餐的组装过程也不同,这步完成产品对象的创建工作。程序实现:1usingSystem;23namespaceKFC4{5///summary6///Builder类,即抽象建造者类,构造套餐7////summary8publicabstractclassBuilder9{10///summary11///添加汉堡12////summary13publicabstractvoidBuildHamb();1415///summary16///添加可乐17////summary18publicabstractvoidBuildCoke();1920///summary21///添加薯条22////summary23publicabstractvoidBuildChip();2425///summary26///返回结果27////summary28///returns食品对象/returns29publicabstractFoodGetFood();30}31}321usingSystem;23namespaceKFC4{5///summary6///NormalBuilder类,具体构造者,普通套餐7////summary8publicclassNormalBuilder:Builder9{10privateFoodNormalFood=newFood();1112publicoverridevoidBuildHamb()13{14NormalFood.Add(NormalHamb,¥10.50);15}1617publicoverridevoidBuildCoke()18{19NormalFood.Add(CokeCole,¥4.50);20}2122publicoverridevoidBuildChip()23{24NormalFood.Add(FireChips,¥2.00);25}2627publicoverrideFoodGetFood()28{29returnNormalFood;30}3132}33}341usingSystem;23namespaceKFC4{5///summary6///GoldBuilder类,具体构造者,黄金套餐7////summary8publicclassGoldBuilder:Builder9{10privateFoodGoldFood=newFood();1112publicoverridevoidBuildHamb()13{14GoldFood.Add(GoldHamb,¥13.50);15}1617publicoverridevoidBuildCoke()18{19GoldFood.Add(CokeCole,¥4.50);20}2122publicoverridevoidBuildChip()23{24GoldFood.Add(FireChips,¥3.50);25}2627publicoverrideFoodGetFood()28{29returnGoldFood;30}3132}33}344.客户从建造者检索产品。从餐馆员工准备好套餐后,顾客再从餐馆员工那儿拿回套餐。这步客户程序要做的仅仅是取回已经生成的产品对象,如时序图中红色部分所示。完整的客户程序:1usingSystem;2usingSystem.Configuration;3usingSystem.Reflection;45namespaceKFC6{7///summary8///Client类9////summary10publicclassClient11{12publicstaticvoidMain(string[]args)13{14FoodManagerfoodmanager=newFoodManager();1516Builderinstance;1718Console.WriteLine(PleaseEnterFoodNo:);1920stringNo=Console.ReadLine();2122stringfoodType=ConfigurationSettings.AppSettings[No+No];2324instance=(Builder)Assembly.Load(KFC).CreateInstance(KFC.+foodType);2526foodmanager.Construct(instance);2728Foodfood=instance.GetFood();29food.Show();3031Console.ReadLine();32}33}34}35通过分析不难看出,在这个例子中,在准备套餐的过程是稳定的,即按照一定的步骤去做,而套餐的组成部分则是变化的,有可能是普通套餐或黄金套餐等。这个变化就是建造者模式中的“变化点“,就是我们要封装的部分。另外一个例子在这里我们再给出另外一个关于建造房子的例子。客户程序通过调用指导者(CDirectorclass)的BuildHouse()方法来创建一个房子。该方法有一个布尔型的参数blnBackyard,当blnBackyard为假时指导者将创建一个Apartment(ConcreteBuilder),当它为真时将创建一个SingleFamilyHome(ConcreteBuilder)。这两种房子都实现了接口Ihouse。程序实现:1//关于建造房屋的例子2usingSystem;3usingSystem.Collections;45///summary6///抽象建造者7////summary8
本文标题:建造者模式过程图解(BuilderPattern)
链接地址:https://www.777doc.com/doc-2427389 .html