一、基本定义:
1、意图:
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
2、适用场景:
* 多个组成部分,都可以装配到同一个对象,但是产生的结果不相同
* 相同的方法,不同的执行顺序,产生不同的事件结果
例:电脑含有很多零配件,可以算是一个复杂对象。其中内存卡,主板、CPU等都是电脑的组成部分,如果构建一台电脑,不需要知道是如何组装的,只需要提供所需要的零配件型号,此时就可以用构建者模式。
3、优点:
* 可以使使用者不必知道内部组成的细节
* 具体构造是独立的,方便逐步细化
4、类图:
* Director:导演类,负责安排模块顺序,通知Builder开始构建
* Builder:抽象Builder类,规范产品的组建
* ConcreteBuilder:构造者实现类,实现抽象类的所有方法,并且返回一个组建好的对象
* Product:产品类
二、实例:
1、产品实体类:
public class Computer {
private String cpu;
private String mainBoard;
private String ram;
public String getCpu() {
return cpu;
}
public void setCpu(String cpu) {
this.cpu = cpu;
}
public String getMainBoard() {
return mainBoard;
}
public void setMainBoard(String mainBoard) {
this.mainBoard = mainBoard;
}
public String getRam() {
return ram;
}
public void setRam(String ram) {
this.ram = ram;
}
}
2、抽象Builder:
public abstract class Builder {
public abstract void buildCpu(String cpu);
public abstract void buildMainBoard(String mainBoard);
public abstract void buildRam(String ram);
public abstract Computer build();
}
3、Builder实现类:
public class ComputerBuilder extends Builder {
private Computer mComputer = new Computer();
@Override
public void buildCpu(String cpu) {
mComputer.setCpu(cpu);
}
@Override
public void buildMainBoard(String mainBoard) {
mComputer.setMainBoard(mainBoard);
}
@Override
public void buildRam(String ram) {
mComputer.setRam(ram);
}
@Override
public Computer build() {
return mComputer;
}
}
4、导演类:
起到封装的作用,避免深入到Builder内部的具体实现。可以传入不同的Builder实现对象。
public class ComputerDirector {
private Builder mBuilder;
private ComputerDirector(Builder builder) {
this.mBuilder = builder;
}
public Computer createComputer(String cpu, String mainBoard, String ram) {
mBuilder.buildCpu(cpu);
mBuilder.buildMainBoard(mainBoard);
mBuilder.buildRam(ram);
return mBuilder.build();
}
}
5、客户端调用:
public class ComputerTest {
public static void main(String[] args){
Builder builder = new ComputerBuilder();
ComputerDirector director = new ComputerDirector(builder);
director.createComputer("i3","my board", "4g");
}
}
特点总结:
* 封装性:使用建造者模式,可以使客户端不用知道产品内部实现的细节
* 构造者比较独立,容易扩展