建造者模式是指将一个复杂的对象的创建过程与它的表示分类,使得同样的创建过程可以创建出不同的表示。简单说,就是把创建对象时像搭积木一样一块一块去拼装对象的属性。建造者模式适用于创建对象的过程需要具体指定创建顺序,且不同的顺序会产生不同的结果。
建造者模式包含四个角色:
- 抽象建造者(IBuilder):IBuilder负责定义复杂对象各部分的创建方法以及创建完成后返回实例的方法;
- 实际建造者(Builder):Builder负责实现IBuilder定义的方法;
- 设计者(Director):Director负责设计负责对象的创建顺序,只负责设计,具体建造过程交给实际建造者;
- 产品(Building):包含各种属性的复杂对象。
下面以建楼为例:
创建Ibuilder:
public interface IBuilder {
void buildGround();
void buildBody();
void buildRoof();
Building build();
}
创建Builder:
public class Builder implements IBuilder {
private Building building = new Building();
@Override
public void buildGround() {
building.setGround("地基");
}
@Override
public void buildBody() {
building.setBody("楼身");
}
@Override
public void buildRoof() {
building.setRoof("楼顶");
}
@Override
public Building build() {
return building;
}
}
创建设计者:
public class Director {
private IBuilder builder;
public Director(IBuilder builder) {
this.builder = builder;
}
public Building direct() {
builder.buildGround();
builder.buildBody();
builder.buildRoof();
return builder.build();
}
}
创建复杂对象:
public class Building {
private String ground;
private String body;
private String roof;
public String getGround() {
return ground;
}
public void setGround(String ground) {
this.ground = ground;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getRoof() {
return roof;
}
public void setRoof(String roof) {
this.roof = roof;
}
@Override
public String toString() {
return "Building{" +
"ground='" + ground + '\'' +
", body='" + body + '\'' +
", roof='" + roof + '\'' +
'}';
}
}
创建业务类:
public class Test {
public static void main(String[] args) {
Director director = new Director(new Builder());
Building building = director.direct();
System.out.println(building.toString());
}
}
Building{ground='地基', body='楼身', roof='楼顶'}
建造者模式中,业务类不需要知道产品创建细节,上述代码用Builder类实现了具体创建方法,用Director类实现了具体建造顺序,如果需要其他创建方法,新增建造者类即可,如果需要其他建造顺序,新增设计者类即可,符合开闭原则。
建造者模式VS工厂方法模式VS策略模式
- 建造者模式和工厂方法模式有相似之处,Ibuilder相当于抽象工厂,Builder相当于具体的工厂实现类,只不过Builder类相对于工厂实现类会显示指定每个属性的创建,更侧重于创建顺序。
- 工厂方法模式没法创建具有复杂建造顺序的产品,如果创建对象需要指定顺序,且能得到不同的结果,则适用于建造者模式。
- 总之一句话,工厂方法模式强调如何生产一个对象,建造者模式强调建造对象的顺序,顺序不同,就可能产生不同的对象。
- 建造者模式与策略模式也十分相似,Ibuilder相当于策略接口,Builder相当于具体的策略实现类,Director相当于选择策略的人Student类,只不过策略模式的Student类侧重的是接收创建的策略类,执行不同的策略行为,针对的是策略类里的策略方法,而建造者模式的Director类侧重的是接收创建的建造者类,设计不同的建造顺序,针对的是产品类里面的各种属性。