建造者模式的各角色定义如下:
产品:复杂的产品类,构建过程相对复杂,需要其他组件组装而成。对应下面代码中的建筑物类。
建造者:建造者接口,定义了构成产品的各个组件的构建标准,通常有多个步骤,对应下面例子中的施工方接口。
建造者实现:可以有多种实现,负责产品的组装但不包含整体建造逻辑。
指导者:持有建造者接口引用的指导者类,指导建造者按一定的逻辑进行建造。
下面用一个场景来解释建造者模式:
建筑物本身应该由多个组件组成,且各组件按一定工序建造,缺一不可。
建筑类Building
public class Building {
//用List来模拟建筑物组件的组装
private List<String> buildingComponents =new ArrayList<>();
//地基
public void setBasement(String basement){
this.buildingComponents.add(basement);
}
//墙体
public void setWall(String wall){
this.buildingComponents.add(wall);
}
//屋顶
public void setRoof(String roof){
this.buildingComponents.add(roof);
}
//后组装的组件先展示
@Override
public String toString() {
String buildingStr="";
for(int i=buildingComponents.size()-1;i>=0;i--){
buildingStr+=buildingComponents.get(i);
}
return buildingStr;
}
}
施工方接口,具备三大件的建造能力
public interface Builder {
//建造地基
public void buildBasement();
//建造墙体
public void buildWall();
//建造屋顶
public void buildRoof();
//获取建筑物
public Building getBuilding();
}
别墅施工方
public class HouseBuilder implements Builder{
private Building house;
public HouseBuilder(){
house=new Building();
}
@Override
public void buildBasement() {
System.out.println("挖土方,部署管道,线缆,水泥加固,搭建围墙,花园");
house.setBasement("++++++++++\n");
}
@Override
public void buildWall() {
System.out.println("搭建木制框架,石膏板封墙并粉饰内外");
house.setWall("| 田 | 田 田 |\n");
}
@Override
public void buildRoof() {
System.out.println("建造木制屋顶,阁楼,安装烟囱,做好防");
house.setRoof("/🎈\n");
}
@Override
public Building getBuilding() {
return house;
}
}
工程总监去把控整个施工流程,无需关心是哪个施工方,也不关心施工方具体的建造细节。
public class Director {
private Builder builder;
public Director(Builder builder){
this.builder=builder;
}
//注入施工方
public void setBuilder(Builder builder){
this.builder=builder;
}
public Building direct(){
System.out.println("====工程项目启动=====");
//打好地基
builder.buildBasement();
//建造框架,墙体
builder.buildWall();
//封顶
builder.buildRoof();
System.out.println("====工程项目竣工====");
return builder.getBuilding();
}
}
开发商客户端类
public class Client {
public static void main(String[] args) {
//组件别墅施工队
Director director=new Director(new HouseBuilder());
System.out.println(director.direct());
}
}
我们的房子建好了