建造模式是对象的创建模式。建造模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。
对一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
其实建造者模式在项目中经常能够看到,比如在Android中我们使用AlertDialog的时候。如下:
类似的还有很多的库都使用了这种建造者模式,可以见的学习这种模式的必要性了。建造模式的类UML类图如下:
构建模式涉及到的角色如下:
抽象构建角色(Builder):给出一个抽象接口,规范产品对象的各个组成成分的构建。在Java中使用接口或者抽象类进行担任,如果抽象构建角色中包含一些其他的业务代码,则推荐使用抽象类。
具体构建角色(ConcreteBuilder):抽象构建角色的具体实现,该角色实现了抽象构建角色声明的接口方法且提供产品的实例。
产品角色(Product):产品是构造中的复杂对象(因为需要构建角色创建多个方法才能进行创建),一般来说,一个系统中会多于一个的产品类。
导演者角色(Director):该角色使用具体建造角色创建产品对象。主要目的是将产品的创建过程进行封装,一个产品创建的过程可能非常复杂,如果不进行封装,则在每次创建不同的产品时,均要重复编写创建产品过程的复杂代码。
实例:我们以创建一辆车为例,车由车牌、颜色和车标组成,下面通过构建模式来创建车辆,可以创建不同种类的车,如:宝马、奔驰、兰博基尼等等。涉及的类如下:
Car:车辆产品
Builder:抽象构建器
CarBuilder:车辆的具体构建器
Director:导演角色,将Builder传递到该类,然后构建车辆的生成过程,客户端使用该类来生产车辆产品。
Java代码如下:
public class SimpleBuilder { public static void main(String[] args) { Builder builder = new CarBuilder(); Director director = new Director(builder); director.construct("red", "A88888", "Ferrari"); System.out.println(builder.build().toString()); } } /** * 产品(车子) */ class Car { private String color; private String licensePlate; private String brand; public void setColor(String color) { this.color = color; } public void setLicensePlate(String licensePlate) { this.licensePlate = licensePlate; } public void setBrand(String brand) { this.brand = brand; } @Override public String toString() { return "Car{" + "color='" + color + '\'' + ", licensePlate='" + licensePlate + '\'' + ", brand='" + brand + '\'' + '}'; } } /** * 抽象构建角色(汽车厂规范) */ interface Builder { // 构建车的颜色 void buildColor(String color); // 构建车的车牌 void buildLicensePlate(String licensePlate); // 构建车的商标 void buildBrand(String brand); // 构建完成最终的汽车 Car build(); } /** * 具体汽车厂 */ class CarBuilder implements Builder { private Car car; public CarBuilder() { this.car = new Car(); } @Override public void buildColor(String color) { car.setColor(color); } @Override public void buildLicensePlate(String licensePlate) { car.setLicensePlate(licensePlate); } @Override public void buildBrand(String brand) { car.setBrand(brand); } @Override public Car build() { return car; } } /** * 导演角色,利用实际汽车厂生产汽车 */ class Director { private Builder builder; public Director(Builder builder) { this.builder = builder; } public void construct(String color, String licensePlate, String brand) { // 车辆生产过程(可能非常复杂) builder.buildColor(color); builder.buildLicensePlate(licensePlate); builder.buildBrand(brand); } }