文章目录
- 前言
- 一、传统方式解决盖房子需求
- 完整代码
- 抽象房子类 AbstractHouse
- 实现子类 普通房子
- 实现子类 高楼大厦
- 客户端盖房子
- 二、引入建造者模式
- 建造者模式的四个角色: 产品、抽象建造者、具体建造者、指挥者
- 完整代码
- House类 (产品角色)
- 抽象父类(抽象建造者) HouseBuilder
- 子类(具体建造者)CommonHouse / HighBuilding
- 指挥者 HouseDirector
- 客户端 Client
- 三、JDK中的建造者模式 StringBuilder
- 四、建造者模式的注意事项和细节
前言
一、传统方式解决盖房子需求
完整代码
抽象房子类 AbstractHouse
package tanchishell.SJMS.builder;
public abstract class AbstractHouse {
//打地基
public abstract void buildBasic();
//砌墙
public abstract void buildWalls();
//封顶
public abstract void roofed();
//建房子
public void build() {
buildBasic();
buildWalls();
roofed();
}
}
实现子类 普通房子
package tanchishell.SJMS.builder;
public class CommonHouse extends AbstractHouse{
@Override
public void buildBasic() {
System.out.println(" 普通房子开始打地基 ");
}
@Override
public void buildWalls() {
System.out.println(" 普通房子砌墙 10 cm ");
}
@Override
public void roofed() {
System.out.println(" 普通房子盖普通屋顶 ");
}
}
实现子类 高楼大厦
package tanchishell.SJMS.builder;
public class HighBuilding extends AbstractHouse {
@Override
public void buildBasic() {
System.out.println(" 高楼大厦打地基 ");
}
@Override
public void buildWalls() {
System.out.println(" 高楼大厦砌墙 20 cm ");
}
@Override
public void roofed() {
System.out.println(" 高楼大厦的透明屋顶 ");
}
}
客户端盖房子
package tanchishell.SJMS.builder;
public class Client {
public static void main(String[] args) {
CommonHouse commonHouse = new CommonHouse();
commonHouse.build();
/** 输出
* 普通房子开始打地基
* 普通房子砌墙 10 cm
* 普通房子盖普通屋顶
*/
}
}
二、引入建造者模式
建造者模式的四个角色: 产品、抽象建造者、具体建造者、指挥者
完整代码
House类 (产品角色)
package tanchishell.SJMS.builder2;
//产品->Product
public class House {
private String baise;
private String wall;
private String roofed;
public String getBaise() {
return baise;
}
public void setBaise(String baise) {
this.baise = baise;
}
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;
}
}
抽象父类(抽象建造者) HouseBuilder
package tanchishell.SJMS.builder2;
// 抽象的建造者
public abstract class HouseBuilder {
//组合房子,同生共死
House house = new House();
//打地基
public abstract void buildBasic();
//砌墙
public abstract void buildWalls();
//封顶
public abstract void roofed();
//建房子
public House buildHouse() {
return house;
}
// //更换房子的创建规模 该场景暂不支持
// public House UpdateHouse(House house2){
// house = house2;
//
// return house;
// }
}
子类(具体建造者)CommonHouse / HighBuilding
package tanchishell.SJMS.builder2;
public class CommonHouse extends HouseBuilder{
@Override
public void buildBasic() {
System.out.println(" 普通房子打地基 ");
}
@Override
public void buildWalls() {
System.out.println(" 普通房子砌墙 10 cm ");
}
@Override
public void roofed() {
System.out.println(" 普通房子的普通屋顶 ");
}
}
package tanchishell.SJMS.builder2;
public class HighBuilding extends HouseBuilder {
@Override
public void buildBasic() {
System.out.println(" 高楼大厦打地基 ");
}
@Override
public void buildWalls() {
System.out.println(" 高楼大厦打砌墙 20 cm ");
}
@Override
public void roofed() {
System.out.println(" 高楼大厦的透明屋顶 ");
}
}
指挥者 HouseDirector
package tanchishell.SJMS.builder2;
public class HouseDirector {
//组合 抽象建造者
HouseBuilder houseBuilder = null;
//构造器传入 houseBuilder
public HouseDirector(HouseBuilder houseBuilder) {
this.houseBuilder = houseBuilder;
}
//通过 setter 传入 houseBuilder
public void setHouseBuilder(HouseBuilder houseBuilder) {
this.houseBuilder = houseBuilder;
}
//如何处理建造房子的流程,交给指挥者
public House constructHouse() {
houseBuilder.buildBasic();
houseBuilder.buildWalls();
houseBuilder.roofed();
return houseBuilder.buildHouse();
}
}
客户端 Client
package tanchishell.SJMS.builder2;
public class Client {
public static void main(String[] args) {
HouseDirector houseDirector = new HouseDirector(new CommonHouse());
//返回产品 普通房子
House house = houseDirector.constructHouse();
System.out.println("-----------------指挥者更换产品 -----------------");
//指挥者更换产品
houseDirector.setHouseBuilder(new HighBuilding());
//返回产品 高楼大厦
House house1 = houseDirector.constructHouse();
}
}
三、JDK中的建造者模式 StringBuilder
四、建造者模式的注意事项和细节