理解软件设计模式中的建造者模式
4个角色:指挥者(Director),建造者(Builder),具体建造者(ConcreteBuilder),产品(Product)
产品:需要创建的对象产品
具体建造者:创建产品的实例并且实现建造者多个方法对产品进行装配
建造者:本质为抽象类,里面的抽象方法供具体建造者重写,声明产品的引用
指挥者:调用建造者抽象类以及其方法
实现思路:客户端创建一个指挥者,并且实例化需要的产品的具体建造者,然后指挥者调用具体建造者的实例即将产品生产出来。
类图:
应用场景:在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是如何使用的:
一、产品角色
//产品 classComputer {privatestringm_CompName;privatestringm_MemorySize;privatestringm_DiskSize;///<summary> ///电脑名称///</summary> publicstringCompName {get{ returnm_CompName; }set{ m_CompName =value; } }///<summary> ///内存大小///</summary> publicstringMemorySize {get{ returnm_MemorySize; }set{ m_MemorySize =value; } }///<summary> ///硬盘大小///</summary> publicstringDiskSize {get{ returnm_DiskSize; }set{ m_DiskSize =value; } }///<summary> ///显示产品的信息///</summary> publicvoidShowComputerInfo() { Console.WriteLine("------------------------"); Console.WriteLine("电脑名称:"+CompName); Console.WriteLine("内存大小:"+MemorySize); Console.WriteLine("硬盘大小:"+DiskSize); } }
二、建造者角色
//建造者 定义建造产品的抽象方法和产品的引用 abstractclassComputerBuilder {privateComputer computerInstance;///<summary> ///返回建立的电脑产品实例///</summary> publicComputer ComputerInstance {get{ returncomputerInstance; }set{ computerInstance=value; } }///<summary> ///创建电脑名称///</summary> abstractpublicvoidCreateCompName();///<summary> ///创建电脑内存///</summary> abstractpublicvoidCreateCompMemory();///<summary> ///创建电脑硬盘///</summary> abstractpublicvoidCreateCompDisk(); }
三、具体建造者角色
//具体建造者创建苹果电脑 classAppleConcreteBuilder : ComputerBuilder {publicoverridevoidCreateCompName() { ComputerInstance =newComputer(); ComputerInstance.CompName ="苹果电脑"}publicoverridevoidCreateCompMemory() { ComputerInstance.MemorySize ="4G"}publicoverridevoidCreateCompDisk() { ComputerInstance.DiskSize ="500G"} }//具体建造者创建戴尔电脑 classDellConcreteBuilder : ComputerBuilder {publicoverridevoidCreateCompName() { ComputerInstance =newComputer(); ComputerInstance.CompName ="戴尔电脑"}publicoverridevoidCreateCompMemory() { ComputerInstance.MemorySize ="2GB"}publicoverridevoidCreateCompDisk() { ComputerInstance.DiskSize ="320GB"} }//具体建造者创建惠普电脑 classHpConcreteBuilder : ComputerBuilder {publicoverridevoidCreateCompName() { ComputerInstance =newComputer(); ComputerInstance.CompName ="惠普电脑"}publicoverridevoidCreateCompMemory() { ComputerInstance.MemorySize ="1GB"}publicoverridevoidCreateCompDisk() { ComputerInstance.DiskSize ="160GB"} }//具体建造者创建IBM电脑 classIBMConcreteBuilder : ComputerBuilder {publicoverridevoidCreateCompName() { ComputerInstance =newComputer(); ComputerInstance.CompName ="IBM电脑"}publicoverridevoidCreateCompMemory() { ComputerInstance.MemorySize ="2G"}publicoverridevoidCreateCompDisk() { ComputerInstance.DiskSize ="1000G"} }
四、指挥者角色
//指挥者 classCreateDirector {///<summary> ///调用建造者抽象方法以生产产品///</summary> ///<param name="compBuilder"></param> publicvoidCreateComputer(ComputerBuilder compBuilder) { compBuilder.CreateCompName(); compBuilder.CreateCompMemory(); compBuilder.CreateCompDisk(); } }