Java设计模式——建造者模式

来源:互联网 发布:手机如何进入淘宝店铺 编辑:程序博客网 时间:2024/06/03 10:05

转载地址:http://redsnow-fenglin.iteye.com/blog/691868

建造者(Builder )模式:将一个产品的内部表象与产品的生产过程分离,从而可以使一个建造过程生成具有不同内部表象的产品对象。若我们把工厂模式看做现实世界的生产车间,负责某种产品的创建工作,那么我们可以把建造者模式看做是组装车间,负责产品组装形成相对复杂的产品。比如采用Builder模式来生成汽车,我们便可以用工厂方法生产汽车所需的各类部件(轮胎、车灯、方向盘、发动机等等),然后由Builder负责组装成最终产品汽车。下图是通用性的Builder模式示例图:

       这样以来,我们便可以看到简单工厂模式、工厂方法、抽象工厂模式与建造者模式它们之间的一些关系与侧重点。简单工厂模式负责产品的创建,使得客户端无需关心产品的创建过程,工厂方法是针对简单工厂模式存在的缺点(不完全支持开-闭原则,增加新产品虽不影响客户端,但需要维护简单工厂逻辑)而引入的,抽象工厂模式引入了产品族的概念,是工厂模式的进一步扩展,而建造者模式则更侧重于复杂产品的生产,期间可以利用工厂模式完成builderPart工作。

      以下是使用建造者模式几种场景以及期待达到的效果。

      场景:1、需要生成的产品对象有复杂的内部结构。(工厂各车间:每个内部成分本身可以是对象,也可以仅是产品对象的一部分,自身并不构成对象概念)
               2、需要生成的产品对象的属性相互依赖。(工厂流水线:builder模式可以强制实行一种分步骤进行的建造过程,因此,若产品对象的一个属性必须在另一个属性被赋值之后才可以赋值,使用builder模式便是一个很好的设计思想)
               3、在对象创建过程中会使用到系统中的其它一些对象,这些对象在产品的创建过程中不易得到。
      效果:使用builder模式主要有以下效果:
              1、builder模式的使用使得产品的内部表象可以独立地变化。客户端不必知道产品内部组成的细节。
              2、每一个builder都相对独立,与其它的builder无关。
              3、模式所建造的最终产品更易于控制。

      在这里我们着重看下建造者(Builder)模式与工厂(Factory)(主要是AbstractFactory)模式间的关系。两者很相似,都是用来创建同时属于几个产品族的对象的模式。不同之处在于--AbstractFactory模式中(相对简单产品),每一次工厂对象被调用时都会返回一个完整的对象,至于client如何处理该对象与工厂自身无关;Builder模式(相对复杂产品,侧重产品组装流水),它则是一点一点地建造出一个复杂的产品,而这个产品的组装过程就发生在builder角色内部。这两种模式,AbstractFactory更加微观,而Builder更加宏观。一个系统可以由一个bulider和一个AbstractFactory组成,client通过调用这个builder角色,间接地调用另一个AbstractFactory角色,AbstractFactory模式返还不同产品族的零件,而Builder模式则把他们组装起来。

1、  需要生成的产品对象有复杂的内部结构。每一个内部成分本身可以是对象,也可以是一个对象(即产品对象)的一个组成部分。


2、  需要生成的产品对象的属性相互依赖。建造模式可以强制实行一种分步骤进行的建造过程,因此,如果产品对象的一个属性必须在另一个属性被赋值之后才可以被赋值,使用建造模式便是一个很好的设计思想。


3、  在对象创建过程中会使用到系统中的其他一些对象,这些产品对象的创建过程不易得到。


四、建造模式与其他模式的关系


建造模式与抽象工厂模式的区别


在抽象工厂模式中,每一次工厂对象被调用时都会返还一个完整的产品对象,而客户端有可能会决定把这些产品组装成一个更大更复杂的产品,也有可能不会。建造类则不同,它一点一点的建造出一个复杂的产品,而这个产品的组装过程就发生在建造者角色内部。建造者模式的客户端拿到的是一个完整的最后产品。


换言之,虽然抽象工厂模式与建造模式都是设计模式,但是抽象工厂模式处在更加具体的尺度,而建造模式则处于更加宏观的尺度上。一个系统可以有一个建造模式和一个抽象工厂模式组成,客户端通过调用这个建造角色,间接的调用另一个抽象工厂模式的工厂角色。工厂模式返还不同产品组的零件,而建造者模式则把它们组装起来。

0 0