建造者模式
将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示
如何理解建造者模式
建造者模式就是将建造复杂对象的过程和组成对象的部件进行解耦。
案例
游戏公司设计游戏角色,其中人、兽、精灵三个种族。而每个种族又拥有不同的英雄角色。所以角色设计应该具备以下特点:
- 角色基本属性一致
- 角色创建过程复杂,不暴露创建细节
- 符合开闭原则,可以随时新增角色
- 各个角色间彼此不受影响
这些特点很符合工厂模式的适用特点,那用工厂模式就可以实现的案例为何要用建造者模式? 主要是一个角色包含有头、手、脚、毛发…等许多部件,不同种族不同角色的部件有许多差异。如果使用工厂模式,那么角色的创建过程会与其各个部件耦合在一起,如果部件比较多,那么角色的创建是比较复杂的。比如所以我们需要将对象的创建过程与组成对象的部件进行解耦,也就是这一章的主题—建造者模式
类图(todo)
- 产品类
定义产品的基本属性
- 抽象建造者
定义产品各个部件的构建规范
- 具体构建者
实现抽象构建者的所有方法,返回一个具体的产品
- 导演类
负责封装已有模块的顺序
- 隔离客户与生产过程
- 控制产品的生成过程
优势
- 良好的封装性。产品类和建造类相对固定,将主要逻辑封装到导演类可以取得比较好的稳定性。
- 不需暴露产品内部细节,将产品本身与产品创建过程进行解耦。
- 精细控制产品创建过程。创建过程清晰,能够把控产品每个部件的创建过程。
- 良好的扩展性。新的需求只需要增加新的建造类就可以解决,符合开闭原则。
局限性
- 建造者不适合差异性很大的产品类。
- 产品内部变化复杂,需要定义很多建造类来实现,会导致系统变得庞大。
使用场景
- 相同的方法,不同的执行顺序,产生不同的事件结果
- 一个对象具有多个部件,但是不同的对象的部件有所差异,也可以使用建造者模式
- 需要隔离复杂对象的创建和使用,并使相同创建过程可以创建不同的产品
建造者模式与工厂模式的区别
工厂模式职责—创建对象
- 将创建过程封装到工厂类,有工厂类提供最终产品。
建造模式职责—零件的装配以产生不同的对象
- 负责创建复杂对象,需要对对象的部件进行装配以产生不同效果的对象,具有的建造过程交给指挥类。由指挥类负责将各个组件按照规则组建为产品。