将一个复杂类的表示与其构造相分离,使得相同的构建过程能够得出不同的表示。
四个核心角色:产品、抽象建造者、具体建造者,指挥者
package com.strife.pattern.builder;
/**
* 建造者模式
*
* @author mengzhenghao
* @date 2022/5/29
*/
public class Builder {
public static void main(String[] args) {
AbstractHouseBuilder houseBuilder = new CommonHouseBuilder();
HouseDirector director = new HouseDirector(houseBuilder);
director.commandBuildHouse();
houseBuilder = new HighBuildingBuilder();
//重置建造者
director.setHouseBuilder(houseBuilder);
director.commandBuildHouse();
}
}
/** 产品(房子)*/
class House {
/** 地基 */
private String basic;
/** 墙 */
private String wall;
/** 房顶 */
private String roofed;
public String getBasic() {
return basic;
}
public void setBasic(String basic) {
this.basic = basic;
}
public String getWall() {
return wall;
}
public void setWall(String wall) {
this.wall = wall;
}
public String getRoofed() {
return roofed;
}
public void setRoofed(String roofed) {
this.roofed = roofed;
}
}
/** 抽象建造者 */
abstract class AbstractHouseBuilder {
/** 组合一个house */
protected House house = new House();
/** 打地基 */
public abstract void buildBasic();
/** 砌墙 */
public abstract void buildWall();
/** 封顶 */
public abstract void roofed();
public House buildHouse() {
return house;
}
}
/** 具体建造者(普通房子)*/
class CommonHouseBuilder extends AbstractHouseBuilder {
@Override
public void buildBasic() {
System.out.println("普通房子打地基");
}
@Override
public void buildWall() {
System.out.println("普通房子砌墙");
}
@Override
public void roofed() {
System.out.println("普通房子封顶");
}
}
/** 具体建造者(高楼) */
class HighBuildingBuilder extends AbstractHouseBuilder {
@Override
public void buildBasic() {
System.out.println("高楼打地基");
}
@Override
public void buildWall() {
System.out.println("高楼砌墙");
}
@Override
public void roofed() {
System.out.println("高楼封顶");
}
}
/** 指挥者 */
class HouseDirector {
private AbstractHouseBuilder houseBuilder;
public HouseDirector(AbstractHouseBuilder houseBuilder) {
this.houseBuilder = houseBuilder;
}
public void setHouseBuilder(AbstractHouseBuilder houseBuilder) {
this.houseBuilder = houseBuilder;
}
/** 指挥者决定如何建造房子 */
public House commandBuildHouse() {
houseBuilder.buildBasic();
houseBuilder.buildWall();
houseBuilder.roofed();
return houseBuilder.buildHouse();
}
}