建造者模式

建造者模式

将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示

如何理解建造者模式

建造者模式就是将建造复杂对象的过程和组成对象的部件进行解耦。

案例

游戏公司设计游戏角色,其中人、兽、精灵三个种族。而每个种族又拥有不同的英雄角色。所以角色设计应该具备以下特点:

  • 角色基本属性一致
  • 角色创建过程复杂,不暴露创建细节
  • 符合开闭原则,可以随时新增角色
  • 各个角色间彼此不受影响

这些特点很符合工厂模式的适用特点,那用工厂模式就可以实现的案例为何要用建造者模式? 主要是一个角色包含有头、手、脚、毛发…等许多部件,不同种族不同角色的部件有许多差异。如果使用工厂模式,那么角色的创建过程会与其各个部件耦合在一起,如果部件比较多,那么角色的创建是比较复杂的。比如所以我们需要将对象的创建过程与组成对象的部件进行解耦,也就是这一章的主题—建造者模式

类图(todo)

  1. 产品类

定义产品的基本属性

  1. 抽象建造者

定义产品各个部件的构建规范

  1. 具体构建者

实现抽象构建者的所有方法,返回一个具体的产品

  1. 导演类

负责封装已有模块的顺序

  • 隔离客户与生产过程
  • 控制产品的生成过程

优势

  1. 良好的封装性。产品类和建造类相对固定,将主要逻辑封装到导演类可以取得比较好的稳定性。
  2. 不需暴露产品内部细节,将产品本身与产品创建过程进行解耦。
  3. 精细控制产品创建过程。创建过程清晰,能够把控产品每个部件的创建过程。
  4. 良好的扩展性。新的需求只需要增加新的建造类就可以解决,符合开闭原则。

局限性

  1. 建造者不适合差异性很大的产品类。
  2. 产品内部变化复杂,需要定义很多建造类来实现,会导致系统变得庞大。

使用场景

  1. 相同的方法,不同的执行顺序,产生不同的事件结果
  2. 一个对象具有多个部件,但是不同的对象的部件有所差异,也可以使用建造者模式
  3. 需要隔离复杂对象的创建和使用,并使相同创建过程可以创建不同的产品

建造者模式与工厂模式的区别

工厂模式职责—创建对象

  • 将创建过程封装到工厂类,有工厂类提供最终产品。

建造模式职责—零件的装配以产生不同的对象

  • 负责创建复杂对象,需要对对象的部件进行装配以产生不同效果的对象,具有的建造过程交给指挥类。由指挥类负责将各个组件按照规则组建为产品。