简介
建造者模式指的是将一个复杂对象的创建与表示分离,使得同样的创建过程可以创建不同的表示,分离了部件的构造(由 Builder 负责)和装配(由 Director 负责)。从而可以构造出复杂的对象,这个模式适用于某个对象的构建过程复杂的情况。由于实现了构建和装配的解耦,不同的构建器,相同的装配,也可以做出不同的对象;相同的构建器,不同的装配顺序。亦即实现构建算法和装配算法的解耦,实现更好的复用。用户只需要指定复杂对象的类型,而无需知晓其内部构造细节。
建造者模式的角色
- 抽象建造者(Builder)类:定义一套抽象的构建方法接口
- 具体建造者(Concrete Builder)类:实现Builder接口,完成复杂产品的每个部件的具体创建方法。在构建过程完成后,提供产品的实例
- 产品(Product)类:具体创建者要创建的复杂对象
- 指挥者(Director)类:调用具体建造者来建造产品的各个部分,在指挥者中不涉及具体产品的信息,只保证对象的各部分完整创建或按某个顺序创建
建造者模式的优点
- 创建者模式的封装性好,使用建造者模式可以有效地封装变化,在使用创建者模式的场景中,一般产品类和建造者类是比较稳定的。因此,将主要的业务逻辑封装在指挥者类中,会具有较好的稳定性
- 客户不必知晓产品内部的实现细节。将产品与产品的创建过程解耦,使得相同的创建过程,也可以创建不同的产品,也可以通过控制创建的顺序,来创建不同的产品
- 可以将产品的创建过程精细化,使得业务逻辑更加清晰
- 创建者模式可扩展性好。当有新的业务需求时,仅需要实现一个新的具体建造者类即可,无需更改原有代码,因此符合开闭原则
建造者模式的缺点
- 仅适用于产品类差异较小的情景
建造者模式的类图
正文
Vehicle 类是一个产品类,实际写为一个实体类即可,代码如下:
public class Vehicle {
private String frame;//框架
private String power;//能源
public String getPower() {
return power;
}
public void setPower(String power) {
this.power = power;
}
public String getFrame() {
return frame;
}
public void setFrame(String frame) {
this.frame = frame;
}
}
抽象建造者类 VehicleBuilder 代码如下:
public abstract class VehicleBuilder {
protected Vehicle vehicle = new Vehicle();
abstract void buildFrame(String frame);
abstract void buildPower(String power);
}
具体建造者 NewEnergyVehicleBuilder 代码如下:
public class NewEnergyVehicleBuilder extends VehicleBuilder {
@Override
void buildFrame(String frame) {
vehicle.setFrame(frame);
}
@Override
void buildPower(String power) {
vehicle.setPower(power);
}
}
具体建造者 GasolineVehicleBuilder 代码如下:
public class GasolineVehicleBuilder extends VehicleBuilder {
@Override
void buildFrame(String frame) {
vehicle.setFrame(frame);
}
@Override
void buildPower(String power) {
vehicle.setPower(power);
}
}
指挥者 VehicleDirector 代码如下:
public class VehicleDirector {
private VehicleBuilder builder;
public VehicleDirector(VehicleBuilder builder) {
this.builder = builder;
}
public Vehicle construct(String frame, String power) {
builder.buildFrame(frame);
builder.buildPower(power);
return builder.vehicle;
}
}
客户端代码如下:
private void testBuilderPattern() {
VehicleBuilder builder = new GasolineVehicleBuilder();
VehicleDirector vehicleDirector = new VehicleDirector(builder);
Vehicle vehicle = vehicleDirector.construct("铝合金车架", "汽油");
Log.i("BuilderPattern", "车架:" + vehicle.getFrame() + " 能源:" + vehicle.getPower());
builder = new NewEnergyVehicleBuilder();
vehicleDirector = new VehicleDirector(builder);
vehicle = vehicleDirector.construct("碳纤维车架", "新能源电池");
Log.i("BuilderPattern", "车架:" + vehicle.getFrame() + " 能源:" + vehicle.getPower());
}
运行效果如下: