六个创建模式之建造者模式(Builder Pattern)

时间:2022-09-12 20:41:33

定义:

将一个复杂的对象的构建与它的表示分类,使得同样的构建过程可以创建不同的表示。建造者模式一步步地创建一个复杂对象,但用户仅需指定对象的类型和内容,不需要关心各个部分之间的关联关系。

结构图:

六个创建模式之建造者模式(Builder Pattern)

  • Builder:抽象建造者,为创建产品定义抽象接口。一般含有两类:buildPartX()方法,用于常见产品的各个部分;getResult()方法,用于返回创建结果。
  • ConcreteBuilder:具体建造者,实现了Builder接口,对一种具体复杂产品进行创建。
  • Product:产品类,含有多个组成部分,具体创建者创建该产品,并定义它的装配过程。
  • Director:指挥类,负责安排复杂对象各个部分之间的创建次序,与建造者之间存在关联关系,需要具体的建造者才能生效。客户端一般只需要和指挥类交互,隐藏了复杂产品的建造细节。

注意:

  • 生产出来的商品依赖于建造者的build方法,build方法中一般会对product进行各种各样的改造,这样对于同一种产品可以有各个部分可以有不同的表示。
  • 指挥类主要有两个作用:一是隐藏产品的建造细节,而是控制产品的创建过程。
  • 建造模式和抽象工厂模式有一定的区别,抽象工厂模式会返回一系列相关的产品,而建造者模式只会返回一种产品,但其每部确实可以灵活多变的。
  • 在一些特殊情况下可以将指挥者和抽象建造者进行合并,在抽象建造者加入静态方法constractor(),然后传入一个具体builder而返回一个产品对象。
  • 可以通过Director类更精细地控制产品的创建过程,因此可以根据设置值的具体内容在Builder内部添加钩子方法。这些通常是boolean类型,方法名一般为isXXX()。在Director中,通过调用这些方法判断分支情况,改变产品类的创建过程。

优点:

  • 客户不知道产品的具体组成细节,不同的创建过程可以构造出不同的产品,将产品本身和产品进行解耦。如果需要不同类型的产品,只需要新添构造类就可,不需要改造产品类。
  • 根据产品的不同属性,可以在Director中更加精细地控制产品创建过程。

缺点:

  • 产品的整体结构内容不能变,只能是各个部分属性的调整。如果产品结构类型差别很大,则不能使用建造者模式。
  • 如果产品种类较多并且产品创建复杂,则需要很多具体建造者来实现,导致系统不可维护。

适用场景:

  • 产品内部是由各个部分组合而成,包含多个成员属性。且这些成员相互依赖,需要制定生成顺序。

实例:

六个创建模式之建造者模式(Builder Pattern)

BuilderPattern.java