应用场景:
建造者模式细分起来有两个用途
1.将整体构建过程和具体部件的构建过程分离,达到使用同一个构建过程创建出不同表示的效果。
就比如按照同一个装修方案装修你刚买的房子,虽然设计布局都一样,这里摆个电视,这里摆个沙发,但是你定制的家具的风格不一样的话,即使使用同一个装修方案,装修出来的房间也大不相同。
2.在构造方法需要大量参数或者构造带约束规则的场景
我们知道构造方法的参数一般是有限的,但是如果一个类的成员变量较多,并且并不是每个都需要设置的时候,这种情况就比较灵活,通过建造者模式只对需要设置的成员变量进行设置,对于不需要的则使用默认的就可以,这时候的构造者模式就相当于一个灵活的构造方法。
建造者模式类图:
从上面类图可以看出主要有三个部分
- 产品类:是我们目标创建对象,一般是过程复杂的对象
- 建造者:定义创建产品各个部分的操作。负责部件构造和部件装配。
在建造者中包含两个部分,一部分创建部件对象,一部分组装部件。
- 指导者:规定如何将builder构建出的部件组装起来。它只负责整体的构建算法,并不负责每部分的具体创建过程。
指导者是较为固定的部分。一般在指导者中有较为复杂的算法,在执行过程中根据需要调用建造者创建出需要的部件。
整个过程如下所示:
指导者运行构建算法,在算法运行到某个阶段需要某个部件的时候调用构造者创建所需的部件,这时候可以将参数传递给建造者供构建过程使用,建造者完成所需部件的构建后,返回构建的部件,指导者继续执行构建算法,直到最后将这些部件给装配起来。
- 第一种用法:
抽象Builder:可以是抽象类或者接口
public interface AbsBuilder { void buildwheel(String wheelType); void buildCarBody(String bodyType); void buildCarDoor(String doorType); }
|
具体Builder
public class ConcreBuilder implements AbsBuilder { private ProductCar mCar = null; public ConcreBuilder() { mCar = new ProductCar(); } public void buildwheel(String wheelType) { mCar.setWheel(wheelType); } public void buildCarBody(String bodyType) { mCar.setCarBody(bodyType); } public void buildCarDoor(String doorType) { mCar.setCarDoor(doorType); } public void resultCar() { if(mCar == null) { return; } System.out.println("车轮:"+mCar.getWheel()); System.out.println("车门:"+mCar.getCarDoor()); System.out.println("车身:"+mCar.getCarBody()); } }
|
产品类
public class ProductCar {
private String wheel = null; private String carBody = null; private String carDoor = null;
public String getWheel() { return wheel; } public void setWheel(String wheel) { this.wheel = wheel; } public String getCarBody() { return carBody; } public void setCarBody(String carBody) { this.carBody = carBody; } public String getCarDoor() { return carDoor; } public void setCarDoor(String carDoor) { this.carDoor = carDoor; } }
|
Director类
public class Director { private ConcreBuilder builder = null; public Director(ConcreBuilder builder) { this.builder = builder; } public void makeCarProduct() { builder.buildCarBody("红色的车身"); builder.buildCarDoor("白色的车门"); builder.buildwheel("五个车轮"); builder.resultCar(); } }
|
Client类
public class Client { public static void main(String args[]) { ConcreBuilder builder = new ConcreBuilder(); Director direcor = new Director(builder); direcor.makeCarProduct(); } }
|
第二种用法:
public class ProductCar { private int mCarwheelNum = 0; private int mCarDoorNum = 0; private String mCarColor = null;
public ProductCar(CarBuilder carBuilder) { mCarColor = carBuilder.getColor(); mCarwheelNum = carBuilder.getWheelNum(); mCarDoorNum = carBuilder.getDoorNum(); }
public void run() { System.out.println("一辆"+mCarColor+"色,"+mCarwheelNum+"轮,"+mCarDoorNum+"个门的车跑起来了"); }
public static class CarBuilder { private int wheelNum = 0; private int doorNum = 0; private String color = null; public CarBuilder() { } public int getWheelNum() { return wheelNum; } public CarBuilder setWheelNum(int wheelNum) { this.wheelNum = wheelNum; return this; } public int getDoorNum() { return doorNum; } public CarBuilder setDoorNum(int doorNum) { this.doorNum = doorNum; return this; } public String getColor() { return color; } public CarBuilder setColor(String color) { this.color = color; return this; } public ProductCar build() { return new ProductCar(this); } } }
|
public class Client { public static void main(String args[]) { ProductCar.CarBuilder builder = new ProductCar.CarBuilder(); ProductCar car = builder.setColor("红").setDoorNum(2).setWheelNum(4).build(); car.run(); } }
|