建造者模式
定义
众所周知,汽车这种具有很复杂结构的物体,很难一下完全构造出来。如图所示,我们可以先分别构建汽车的各个组成部分:发动机(engine)、底盘(chassis)、车身(carBody)、各种汽车系统(carSystem),然后将这些部分进行组装就形成了一个完整的汽车。建造者模式就是一种让你分步骤创建复杂对象的设计模式。
示例分析
首先我们定义一个汽车对象,包含以上所说的各个部分。并且重写了 toString() 方法,方便最终我们的打印输出
public class Car {
private String engine;
private String chassis;
private String carBody;
private String carSystem;
public Car() {
}
public Car(String engine, String chassis, String carBody, String carSystem) {
this.engine = engine;
this.chassis = chassis;
this.carBody = carBody;
this.carSystem = carSystem;
}
@Override
public String toString() {
return String.format("这是一辆组装好的汽车,包含:\n引擎: %s,\n底盘: %s,\n车身:%s,\n车载系统:%s",
this.engine, this.chassis, this.carBody, this.carSystem);
}
} 然后我们定义抽象的构建者类 CarBuilder ,该类中的每个方法就是建造的一个步骤,并且包含一个最终的组装方法(即之前提到的模板方法模式)。
public abstract class CarBuilder {
public abstract String buildEngine();
public abstract String buildChassis();
public abstract String buildCarBody();
public abstract String buildCarSystem();
public Car build() {
return new Car(
buildEngine(),
buildChassis(),
buildCarBody(),
buildCarSystem()
);
}
} 接下来我们分别实现宝马车和奥迪车对每个汽车部分的实现。相当于我们汽车工厂的流水线已经构建好了。
public class AudiCarBuilder extends CarBuilder {
@Override
public String buildEngine() {
return "奥迪---引擎";
}
@Override
public String buildChassis() {
return "奥迪---底盘";
}
@Override
public String buildCarBody() {
return "奥迪---车身";
}
@Override
public String buildCarSystem() {
return "奥迪---车载系统";
}
}
public class BMWCarBuilder extends CarBuilder {
@Override
public String buildEngine() {
return "宝马---引擎";
}
@Override
public String buildChassis() {
return "宝马---底盘";
}
@Override
public String buildCarBody() {
return "宝马---车身";
}
@Override
public String buildCarSystem() {
return "宝马---车载系统";
}
} 要想生产汽车,一定要有一个汽车工厂才行,接下来我们构建一个汽车工厂用来生产汽车。该工厂就是你给我一条汽车生产流水线(即明确的汽车建造者),我就给你生产一辆汽车。
public class CarFactory {
public static Car buildCar(CarBuilder builder) {
return builder.build();
}
} 最终我们通过 Client 执行我们的整体流程,并打印最终的结果
public class Client {
public static void main(String[] args) {
Car bmwCar = CarFactory.buildCar(new BMWCarBuilder());
System.out.println(bmwCar);
System.out.println();
Car audiCar = CarFactory.buildCar(new AudiCarBuilder());
System.out.println(audiCar);
}
} 这是一辆组装好的汽车,包含: 引擎: 宝马---引擎, 底盘: 宝马---底盘, 车身:宝马---车身, 车载系统:宝马---车载系统 这是一辆组装好的汽车,包含: 引擎: 奥迪---引擎, 底盘: 奥迪---底盘, 车身:奥迪---车身, 车载系统:奥迪---车载系统
优缺点
优点
- 可以分步创建对象, 暂缓创建步骤或递归运行创建步骤
- 生成不同形式的产品时, 你可以复用相同的制造代码
- 单一职责原则。 你可以将复杂构造代码从产品的业务逻辑中分离出来
缺点
- 该模式需要新增多个类, 会导致代码整体复杂程度会有所增加
科大讯飞公司氛围 474人发布