前言
你去买车,你不会只买一个轮胎、一个发动机、一个方向盘,你买的是一辆包括轮胎、方向盘、发动机、底盘、电气系统和车身等多个部件组成的完整骑车。
在设计模式中,建造者模式就是解决如何将这些部件组装成一辆完整的汽车并返回给用户的设计模式。建造者模式为客户端返回的不是一个简单的产品,而是一个由多个部件组成的复杂产品。
思考如下问题
假设让我们思考如何创建一个房屋对象。建造一栋简单的房屋,你需要建造地板和四面的强,安装房门和窗户,然后再建造一个漂亮的屋顶。
但如果想要一个更宽敞舒适的别墅,还需要有院子、游泳池、植物和其他设施(例如中央空调、排水、供电设备),那又该怎么办呢?
最简单的方法就是扩展房屋的积累,然后创建一系列涵盖所有参数组合的子类。随着房子越复杂,子类越多,任何新增的参数都会让这个层次结构更加复杂。
另外一种方式则无需生成子类,我们可以在房屋基类中创建一个包含所有可能参数的超级构造函数,并用它来控制房屋对象,这种方法确实可以避免生成子类,但它却会造成另外一个问题——构造函数参数太多。
House(windows, doors, rooms, hasSwimPool, hasGarden,...)
但并不是所有的房子都需要游泳池,导致绝大部分的参数都没有使用,使得构造函数的声明复杂,调用不整洁。
解决方式就是今天要介绍的建造者模式。
建造者模式概念
建造者模式(Builder Pattern),又称生成器模式,是较为复杂的创建者模式,它将客户端与包含多个组成部分的复杂对象的创建过程分离,客户端无需知道复杂对象的内部组成部分与装配方式,只需要知道所需的建造者类型即可。
定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
结构图如下:
由上图可以知道,建造者模式包含 4 个角色:
Builder
抽象建造者:它为创建一个产品 Product 对象的各个部件指定抽象接口,这个接口一般包括两类方法:buildPartX()
:用于创建复杂对象的各个部件getResult()
:用于返回复杂对象ConcreteBuilder
具体建造者:它实现了Builder
接口,实现各个部件的具体构造和装配方法,定义并明确其所创建的复杂对象,也可以提供一个方法返回创建好的复杂产品对象Product
产品角色:它是最终被构建的复杂对象,包含多个组成部件,具体建造者创建该产品的内部表示并定义其装配过程。Director
主管、指挥者:指挥者又被称为导演类,定义调用构造步骤的顺序。它负责安排负责对象的建造次序,指挥者和抽象建造者之间存在关联关系,可以在其construct()
建造方法中调用建造者对象的部件构造与装配方法,完成负责对象的建造。