建造者模式定义
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
使用场景
- 创建复杂对象的算法独立于组成对象的部件
- 同一个创建过程需要有不同的内部表象的产品对象
建造者模式构成
通用类图
角色
Product产品类
表示被构造的复杂对象,当有许多产品类时,可以抽象出一个接口。Builder抽象建造者
该接口是所有具体创造者(ConcreteBuilder)的抽象接口,用以规范产品对象的各个部分的构建。该类包含两种方法:一种是建造对象组件的方法(BuildPart())、一种是返回产品对象的方法。ConcreteBuilder具体建造者
实现接口(Builder)定义的所有方法,并且返回一个建造好的产品对象。如果有多个产品类,那么也会有多个具体建造者与之一一对应。Director导演类
导演类负责把客户想要创建的产品对象请求委托给对应的建造者来创建产品,导演类不与产品类产生依赖关系,具体的创建过程是由具体建造者执行。
示例
该示例是建造自行车、电动车、摩托车的例子。利用建造者模式,以同一个创建过程建造不同的车类。
类图:
代码:
产品类接口CarModel
public interface CarModel {
void installCarBody();
void installPowerSystem();
void installWheel();
}
产品Bike类
public class Bike implements CarModel{
public void installCarBody() {
System.out.println("安装自行车车身。");
}
public void installPowerSystem() {
System.out.println("安装自行车动力系统:无。");
}
public void installWheel() {
System.out.println("安装自行车车轮。");
}
}
省略产品Electrombile类、Motorbike类,其代码和Bike类似,具体构建有差别。
抽象建造者CarBuilder
public interface CarBuilder {
void buildCarBody();
void buildPowerSystem();
void buildWheel();
CarModel buildCarModel();
}
具体构建者BikeBuilder
public class BikeBuilder implements CarBuilder {
private Bike bike = new Bike();
public void buildCarBody() {
this.bike.installCarBody();
}
public void buildPowerSystem() {
this.bike.installPowerSystem();
}
public void buildWheel() {
this.bike.installWheel();
}
public CarModel buildCarModel() {
return this.bike;
}
}
同样省略ElectrombileBuilder和MotorbikeBuilder。
导演类Director
public class Director {
private CarBuilder carBuilder;
public Director(CarBuilder carBuilder) {
this.carBuilder = carBuilder;
}
public CarModel constructCarModel() {
this.carBuilder.buildCarBody();
this.carBuilder.buildPowerSystem();
this.carBuilder.buildWheel();
return this.carBuilder.buildCarModel();
}
}
客户测试类Client
public class Client {
public static void main(String [] args) {
BikeBuilder bikeBuilder = new BikeBuilder();
Director director = new Director(bikeBuilder);
Bike bike = (Bike)director.constructCarModel();
ElectrombileBuilder electrombileBuilder = new ElectrombileBuilder();
director = new Director(electrombileBuilder);
Electrombile electrombile = (Electrombile)director.constructCarModel();
MotorbikeBuilder motorbikeBuilder = new MotorbikeBuilder();
director = new Director(motorbikeBuilder);
Motorbike motorbike = (Motorbike)director.constructCarModel();
}
}
输出:
安装自行车车身。
安装自行车动力系统:无。
安装自行车车轮。
安装电动车车身。
安装电动车动力系统:电力动力系统。
安装电动车车轮。
安装摩托车车身。
安装摩托车动力系统:汽油动力系统。
安装摩托车车轮。
代码下载:https://github.com/ByrsH/Design-Patterns/tree/master/Design%20Patterns/src/main/java/com/yrs/builder
建造者模式优点
封装性
使客户端不必知道产品内部组成的细节建造者独立,容易扩展
参考
- 设计模式之禅(第2版)
- 教你用设计模式之建造者模式