实现思路:客户端创建一个指挥者,并且实例化需要的产品的具体建造者,然后指挥者调用具体建造者的实例即将产品生产出来。
类图:
![极速理解设计模式系列:1.建造者模式(Builder Pattern)](/Files/20117/8253cf73-887d-4f50-bc98-1ae036b9b6f1.gif)
应用场景:在Silverlight中我们需要生产一列多行的输入框+TextBlock的组合,但是这些输入框的类型不同,有一些只能输入256个字符,有的只能输入20个字符,还有的是多行的,有的是单行的输入框。这些输入框的种类是固定的,但是可能用户自定义输入框的时候我们生成的顺序和各自的生成数量不知道。
分析:在这里产品是固定的,有A,B,C,D,E,F六种输入框+TextBlock,用户可能生成的情况是A,A,C,C,B,B,C、也可能是B,C,D,B,C,F。这里我们使用建造者模式,这几种输入框基本上都差不多,都是TextBlock+TextBox的模式。但是可输入数量和是否多行是不定的,那么我们实现AConcreteBuilder,BConcreteBuilder,CConcreteBuilder,DConcreteBuilder,EConcreteBuilder,FConcreteBuilder等多个具体建造者,然后对于建造者中只需要两个方法分别实例化产品,并且对产品的属性(可输入字符数、是否可多行)进行设置,然后再用户需要调用什么产品的时候,使用指挥者调用想要的ConcreteBuilder具体建造者即可。
下面我们以一个电脑产品生产的实例来具体看看Builder Pattern是如何使用的:
一、产品角色
//产品 class Computer { private string m_CompName; private string m_MemorySize; private string m_DiskSize; ///
二、建造者角色
//建造者 定义建造产品的抽象方法和产品的引用 abstract class ComputerBuilder { private Computer computerInstance; ///
三、具体建造者角色
//具体建造者创建苹果电脑 class AppleConcreteBuilder : ComputerBuilder { public override void CreateCompName() { ComputerInstance = new Computer(); ComputerInstance.CompName = "苹果电脑"; } public override void CreateCompMemory() { ComputerInstance.MemorySize = "4G"; } public override void CreateCompDisk() { ComputerInstance.DiskSize = "500G"; } } //具体建造者创建戴尔电脑 class DellConcreteBuilder : ComputerBuilder { public override void CreateCompName() { ComputerInstance = new Computer(); ComputerInstance.CompName = "戴尔电脑"; } public override void CreateCompMemory() { ComputerInstance.MemorySize = "2GB"; } public override void CreateCompDisk() { ComputerInstance.DiskSize = "320GB"; } } //具体建造者创建惠普电脑 class HpConcreteBuilder : ComputerBuilder { public override void CreateCompName() { ComputerInstance = new Computer(); ComputerInstance.CompName = "惠普电脑"; } public override void CreateCompMemory() { ComputerInstance.MemorySize = "1GB"; } public override void CreateCompDisk() { ComputerInstance.DiskSize = "160GB"; } } //具体建造者创建IBM电脑 class IBMConcreteBuilder : ComputerBuilder { public override void CreateCompName() { ComputerInstance = new Computer(); ComputerInstance.CompName = "IBM电脑"; } public override void CreateCompMemory() { ComputerInstance.MemorySize = "2G"; } public override void CreateCompDisk() { ComputerInstance.DiskSize = "1000G"; } }
四、指挥者角色
//指挥者 class CreateDirector { ///
public void CreateComputer(ComputerBuilder compBuilder) { compBuilder.CreateCompName(); compBuilder.CreateCompMemory(); compBuilder.CreateCompDisk(); } }
如需源码请点击 BuilderPattern.zip 下载。
最新评论