建造者模式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了建造者模式相关的知识,希望对你有一定的参考价值。

    建造者模式也是对象创建模式,主要用于构建复杂的组成对象。既对象类由多个组件组成,如汽车由引擎/轮子/方向盘/框    架等部分组成。建造者模式的目的在于,在客户端制定特性类型的前提下,透明的创建这些组件并组成最终产品,而这一切对客户端是透明的。而且扩展不同的复杂对象类时,要易于扩展。
    定义:

建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一种对象创建型模式。

技术分享

 
技术分享
product:最终产品。包含多个组件。
Builder : 抽象建造者,定义了各个部件的抽象创建方法,和返回最终结果的方法。
ConcreteBuilder: 具体建造者,根据具体产品实现Builder的方法。
Director : 指挥者,负责安排部件的构建顺序等构建步骤。客户端只需与指挥者交互,客户端通过实例化具体建造者并传给指挥者,之后的任务就交给了指挥者。指挥者按照事先定义好的步骤调用具体建造者的实现方法。最终指挥者将构建好的产品对象返回给客户端。这样整个过程就完成了。
 
    在该模式中,客户端只需要知道带创建的类型即可,其他的任务都交给指挥者,隔离了创建的具体细节。同时增加新类型,只需增加一个新的具体实现类即可,完全符合开闭原则。
    
    上面的结构是相对标准的建造者模式的结构,下面介绍一些灵活的变通。
  • 可以将Director省略掉,将指挥者的construct方法放到抽象建造者中定义。

abstract class AnmBuilder {

       protected  Anm anm= new Anm ();

       public  abstract void buildName();

       public  abstract void buildAge();

       public Anm construct() {

              this.buildName();

              this.buildAge();

              return anm;

       }

}

          或者

public static Actor  construct(AnmBuilder ab) {

              this.buildName();

              this.buildAge();

 

              return anm;

}

  • 钩子方法:上述结构中,产品组件的构造和产品的组装步骤都在指挥者内定义好了,难免有些不够灵活。通过引入构字方法,让具体的构造者可以在一定范围内反控制构造过程,增加灵活性。例如在上例的抽象构造者中定义getBuildAge方法,来控制是否构造Age组件,则在指挥者中可以这样实现反控制:

public static Actor  construct(AnmBuilder ab) {

              this.buildName();

              if(ab.getBuildAge()) {

                      this.buildAge();

              }

              return anm;

}

    

总结:

    优点:

  • 将客户端和具体构造细节隔离开,创建和使用解耦。
  • 具体创建者间相互独立,增加新产品无需改动原有构造者。
    缺点:
  • 产品往往需要拥有较大的共同点,如果差异性很大,建造者模式很难处理。
  • 如果产品内部复杂多变,具体建造者的数量和复杂度都会很大,使系统复杂化。
    适用场景:
  • 产品有多个属性,并且属性间的构造有一定依赖和逻辑性
  • 不同产品件有较高的共同点,可以抽象出一个相对统一的组装过程(指挥者)。
  • 希望将对象的构造和使用解耦,隔离创建和使用,以便分工做系统模块更加清晰。

以上是关于建造者模式的主要内容,如果未能解决你的问题,请参考以下文章

建造者模式(Builder)

设计模式之建造者模式

第十三章-建造者模式

设计模式 创建者模式 -- 建造者模式

设计模式从青铜到王者第八篇:创建型模式之建造者模式(BuilderPattern)

Java设计模式-建造者模式