Core
建造者模式又称为生成器模式
,主要用于对复杂对象的构建、初始化,它可以将多个简单的组件对象按顺序一步步组装起来,最终构建成一个复杂的成品对象。
与工厂系列模式不同的是,建造者模式的主要目的在于把烦琐的构建过程从不同对象中抽离出来,使其脱离并独立于产品类与工厂类,最终实现用同一套标准的制造工序能够产出不同的产品。
Key elements
- 抽象建造者 interface
- 产品
- 具体建造者 A
- 具体建造者 B
- 具体管理者(也叫监督者)生产产品 [可选]
- Client
Example of House building
使用房屋建造这个场景
来讲述Builder Pattern真是再合适不过了,毕竟我是学过相关课程。
// 抽象建造者
public interface HouseBuilder {
void setWall(String wall);
void setRoof(String roof);
void setFloor(String floor);
House getHouse();
}
产品 —— 这里的产品是盖房(盖房流程很多)
// 产品(房屋)
public class House implements HouseBuilder{
private String wall;
private String roof;
private String floor;
public void setWall(String wall) {
this.wall = wall;
}
public void setRoof(String roof) {
this.roof = roof;
}
public void setFloor(String floor) {
this.floor = floor;
}
@Override
public House getHouse() {
System.out.println(this.floor);
System.out.println(this.wall);
System.out.println(this.roof);
return this;
}
}
具体实施者
// 开发商 A
public class ConcreteHouseBuilderA implements HouseBuilder {
private House house = new House();
@Override
public void setWall(String wall) {
house.setWall(wall + "I am A 供应商");
}
@Override
public void setRoof(String roof) {
house.setRoof(roof);
}
@Override
public void setFloor(String floor) {
house.setFloor(floor);
}
@Override
public House getHouse() {
return house;
}
}
// 开发商 B
public class ConcreteHouseBuilderB implements HouseBuilder {
private House house = new House();
@Override
public void setWall(String wall) {
house.setWall(wall + "I am B 供应商");
}
@Override
public void setRoof(String roof) {
house.setRoof(roof);
}
@Override
public void setFloor(String floor) {
house.setFloor(floor);
}
@Override
public House getHouse() {
return house;
}
}
管理者:
// 工程监理
// 工程总监的角色就像电影制作中的导演一样,他从宏观上管理项目并指导整个施工队的建造流程.
public class Director {
private HouseBuilder houseBuilder;
public Director(HouseBuilder builder) {
this.houseBuilder = builder;
}
public void setBuilder(HouseBuilder builder) {
this.houseBuilder = builder;
}
public House direct() {
// 第一步,打好地基
houseBuilder.setFloor("口口口口口口口口 I am 地基");
// 第二步,建造框架、增体
houseBuilder.setWall("| 田 | | 田 | ");
// 第三步,封顶
houseBuilder.setRoof("_______________ I am 屋顶");
return houseBuilder.getHouse();
}
}
Client
// 项目实施
public class Client {
public static void main(String[] args) {
// 招标之后 选了 B供应商
Director director = new Director(new ConcreteHouseBuilderB());
director.direct().getHouse();
}
}
out:
口口口口口口口口 I am 地基
| 田 | | 田 | I am B 供应商
_______________ I am 屋顶