建造者模式.doc_第1页
建造者模式.doc_第2页
建造者模式.doc_第3页
建造者模式.doc_第4页
建造者模式.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

?php /* * 建造者模式 * 将一个复杂对象的构建与它的表示分离,使用同样的构建过程可以创建不同的表示 */ class Product public $_type = null; public $_size = null; public $_color = null; public function setType($type) echo set product type; $this-_type = $type; public function setSize($size) echo set product size; $this-_size = $size; public function setColor($color) echo set product color; $this-_color = $color; $config = array( type=shirt, size=xl, color=red ); / 没有使用bulider以前的处理 $oProduct = new Product(); $oProduct-setType($configtype); $oProduct-setSize($configsize); $oProduct-setColor($configcolor); / 创建一个builder类 class ProductBuilder var $_config = null; var $_object = null; public function ProductBuilder($config) $this-_object = new Product(); $this-_config = $config; public function build() echo - in builder-; $this-_object-setType($this-_configtype); $this-_object-setSize($this-_configsize); $this-_object-setColor($this-_configcolor); public function getProduct() return $this-_object; $objBuilder = new ProductBuilder($config); $objBuilder-build(); $objProduct = $objBuilder-getProduct();建造者模式定义将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。实用范围1 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。2 当构造过程必须允许被构造的对象有不同表示时。角色:1.建造者(Builder)角色:给出一个抽象接口,以规范产品对象的各个组成成分的建造。一般而言,此接口独立于应用程序的商业逻辑。模式中直接创建产品对象的是具体建造者(Concrete Builder)角色。具体建造者类必须实现这个接口所要求的方法:一个是建造方法,另一个是结果返还方法。2.具体建造者(Concrete Builder)角色:担任这个角色的是于应用程序紧密相关的类,它们在应用程序调用下创建产品实例。这个角色主要完成的任务包括:实现Builder角色提供的接口,一步一步完成创建产品实例的过程。在建造过程完成后,提供产品的实例。3.指导者(Director)角色:担任这个角色的类调用具体建造者角色以创建产品对象。导演者并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者对象。4.产品(Product)角色:产品便是建造中的复杂对象。指导者角色是于客户端打交道的角色。导演者角色将客户端创建产品的请求划分为对各个零件的建造请求,再将这些请求委派给具体建造者角色。具体建造者角色是做具体建造工作的,但却不为客户端所知。五、应用1. 建造者模式的优点封装性 使用建造者模式可以使客户端不必知道产品内部组成的细节,如例子中我们就不需要关心每一个具体的模型内部是如何实现的,产生的对象类型就是CarModel。建造者独立,容易扩展 Builder之间是相互独立的,与其它的Builder无关,对系统的扩展非常有利。便于控制细节风险 模式所建造的最终产品更易于控制:由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。2. 建造者模式的使用场景相同的方法,不同的执行顺序,产生不同的事件结果时,可以采用建造者模式,需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序。多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,则可以使用该模式。产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式是非常合适。在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到时,也可以采用建造者模式封装该对象的创建过程。该种场景,只能是一个补偿方法,因为一个对象不容易获得,而在设计阶段竟然没有发觉,而要通过创建者模式柔化创建过程,本身已经违反设计最初目标。3. 建造者模式的注意事项 建造者模式关注的是的零件类型和装配工艺(顺序),这是它与工厂方法模式最大不同的地方,虽然同为创建类模式,但是注重点不同。六、和其他模式的区别: 与抽象工厂模式相比,建造者模式返回一个组装好的完整产品,而抽象工厂模式返回一系列相关的产品,这些产品位于不同的产品等级结构,构成了一个产品族。在抽象工厂模式中,客户端实例化工厂类,然后调用工厂方法获取所需产品对象,而在建造者模式中,客户端可以不直接调用建造者的相关方法,而是通过指挥者类来指导如何生成对象,包括对象的组装过程和建造步骤,它侧重于一步步构造一个复杂对象,返回一个完整的对象。如果将抽象工厂模式看成汽车配件生产工厂,生产一个产品族的产品,那么建造者模式就是一个汽车组装工厂,通过对部件的组装可以返回一辆完整的汽车。 class Product /产品private String name;private String type;public void showProduct()System.out.println(名称:+name);System.out.println(型号:+type);public void setName(String name) = name;public void setType(String type) this.type = type;abstract class Builder /抽象建造者public abstract void setPart(String arg1, String arg2);public abstract Product getProduct();class ConcreteBuilder extends Builder /具体建造者private Product product = new Product();public Product getProduct() return product;public void setPart(String arg1, String arg2) product.setName(arg1);product.setType(arg2);public class Director /指导者角色private Builder builder = new ConcreteBuilder();public Product getAProduct()builder.setPart(宝马汽车,X7);return builder.getProduct();public Product getBProduct()builder.setPart(奥迪汽车,Q5);return builder.getProduct();public class Client public static void main(String args)Director director = new Director();Product product1 = director.getAProduct();product1.showProduct();Product product2 = director.getBProduct();product2.showProduct();同工厂模式的区别有,1可以返回不同的产品,产品很复杂2,多了一层建造者。当做一种事情的步骤是必不可少的。也就是说做这种事情,所有的步骤是不会少的。但是这些事情的具体做法的步骤实现又是不一样的。 由每个个具体的对象去实现 。 比如做一道菜,放盐,油等这些都是不可少的,但是每个人放的量又不一样。 有的时候我们做的时候就可能会因为一件事情的步骤太多而忘记了做某个步骤,造成后面做出来的东西是不能用的。建造者模式:它的原理就是像上面那样,为了避免忘记做某个步骤,我们把这些步骤都抽象出来到一个类里面, 然后每个具体的实现都不得不去实现这些步骤(也就是一个方法一样吧),具体方法的实现是由每个具体类自己去 做的,如果就是这样,我们就会发现这时候,等于就是这个吃菜的人吧,他要对做菜的人说,放盐,放油,呵呵,这完全是没有必要的,所以在建造者模式当中还有一个重要的类,就是指挥者,它和客户和做菜人之间打交道, 客户对着它说做菜,然后它在叫某个具体做菜的人去做咯。 使用建造者模式的场合和好处使用建造者模式的好处:1.使用建造者模式可以使客户端不必知道产品内部组成的细节。2.具体的建造者类之间是相互独立的,对系统的扩展非常有利。3.由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。使用建造模式的场合:1.创建一些复杂的对象时,这些对象的内部组成构件间的建造顺序是稳定的,但是对象的内部组成构件面临着复杂的变化。2.要创建的复杂对象的算法,独立于该对象的组成部分,也独立于组成部分的装配方法时。 四、模式优缺点 优点 1、将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,使得我们能够更加精确的控制复杂对象的产生过程。 2、将产品的创建过程与产品本身分离开来,可以使用相同的创建过程来得到不同的产品。也就说细节依赖抽象。 3、每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。 缺点 1、建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。 2、如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。工厂方法模式: 把一个类的实例化延迟到它的子类中,核心的工厂类不负责所有产品的创建,而是将具体创建的工作交给子类去做。让子类决定实例化哪一个类。即抽象工厂角色。抽象工厂模式: 向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,创建多个产品族中的产品对象。既提供一个创建一系列相关或相互以来对象的接口,而无需指定它们的具体的类,这就是抽象工厂模式的用意。是工厂方法模式的进一步推广。建造者模式: 建造者模式将一个产品的内部表象和产品的生成过程分开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。建造者模式的尺度比幾種工廠樣式的尺度大一些,建造者樣式常常用來組裝零件,工廠樣式常常用來建構零件。 Builder Pattern解决的问题是: 需要构造的对象非常复杂,而调用者不需要知道这些细节。例如模仿一个特殊的编译器,该编译器编译所有源代码,将其链接,然后压缩,最后加密。有多 个类:Editor(编辑器)、Builder(构建器)、Compiler(编译器)、Linker(链接器)、Compressor(压缩器)、 Encryptor(加密机)。建造模式的关键是导演角色,这个角色掌握了零件对象的状态和产品的整体组装蓝图。没有了这个角色,建造模式就不是建造模式。当然,导演角色可以同时持有几种蓝图,按照需要给出完全不同的组装结果。反过来,拿来任何一个创建模式,加上一个导演角色,就给出了(某种形式的)建造模式。换言之,导演角色是建造模式的中心角色。建造模式的名字起得不好,应该改名为导演模式。 可以看到建造模式和工厂是有点相近的,但是又有不同1)建造模式侧重于“装配”、“拼装”.而工厂侧重于“生产”2)建造模式的导演,很清楚产生的步骤,因为他把握这生产者的接口(知道生产步骤)而工厂,却不知道,他只知道自己产出产品(也就是不同对象可能构造方法不一样,我的例子在这里有点看不出来)3)建造模式屏蔽的是“装配”的细节,工厂模式则是屏蔽“构造”的细节.(有点晕其实) 另一个角度说,建造模式比工厂模式“宏观”建造模式里面的生产者可以是工厂模式!拿上面的例子说:假如PSP的生产需要屏幕,按钮,电池,芯片,建造模式则负责拿4个部件拼合成PSP,而工厂模式则负责拿更微观的电路板,螺丝,液晶等分别生产出屏幕,按钮,电池,芯片供上层使用,也就是说工厂模式在这个时候充当了建造模式的具体生产者!(1)UML如图4-1所示,该UML图详细说明了一个使用建造者设计模式的类设计.下面是对图4-1的说明:1.MyObject类具有能够完全实现对象构造的两个方法。为了具有完整MyObject对象, 需要执行 complexFunctionA()和 complexFunctionB()方法。2. MyObjectBuilder 类包含一个名为 createInstanceOfMyObjcct()的方法。这个类负责创建MyObject类的一个简单实例。需要注意没有用于进一步构造的配置选项.这个类还存储MyObjectBuilder类创建的实例中的私有实例。3.buildMyObject()方法接受参数 configurationOptions,这个方法用于调用在MyObjectBuilder 对象中存储的 MyObject 对象的 complexFunctionA()和complexFunctionB()方法4.getBuildMyObject()方法返回MyObjectBuilder对象内部MyObject对象的私有实 例,该实例既是完整的,也是正确构建的。4.3代码示例具体项目包含一个创建复杂产品对象的类。这个类包含完整构成对象的3个方法。如果在创建新产品对象时没有调用其中任何一个方法,那么类的属性便会丢失,并且程序也将中断。这3个方法是setType( )、setColor()和setSize(),如下面的代码所示,最早版本的代码被设计为先创建产品对象,然后再执行上述3个方法。class product protected $_type = ; protected $_size = ;protected $_color = ;public function setType ($type)$this- _type = $type;public function setSize($size) $this- size = $size;public function setColor ($color)$this-_color = $color;为了创建完整的产品对象,需要将产品配置分别传递给产品类的每个方法:$productConfigs=array (type=shirt ,size =XL, color= red);$product = new product ();$product-setType ($productConfigstype);$product-setSize($productConfigssize);$product-setColor(SproductConfigscolor);创建对象时分别调用每个方法并不是最佳的做法.此时,我们最好使用基于建造者设计模式的对象来创建这个产品实例。productBuilder类被设计为接受构建product对象所需的这些配置选项。它不仅存储配置参数,而且存储一个实例化的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论