第七章 建造者模式
文章目录
- 前言
- 一、传统方式解决盖房子需求
-
- 完整代码
- 抽象房子类 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{@Overridepublic void buildBasic() {System.out.println(" 普通房子开始打地基 ");}@Overridepublic void buildWalls() {System.out.println(" 普通房子砌墙 10 cm ");}@Overridepublic void roofed() {System.out.println(" 普通房子盖普通屋顶 ");}
}
实现子类 高楼大厦
package tanchishell.SJMS.builder;public class HighBuilding extends AbstractHouse {@Overridepublic void buildBasic() {System.out.println(" 高楼大厦打地基 ");}@Overridepublic void buildWalls() {System.out.println(" 高楼大厦砌墙 20 cm ");}@Overridepublic 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{@Overridepublic void buildBasic() {System.out.println(" 普通房子打地基 ");}@Overridepublic void buildWalls() {System.out.println(" 普通房子砌墙 10 cm ");}@Overridepublic void roofed() {System.out.println(" 普通房子的普通屋顶 ");}
}
package tanchishell.SJMS.builder2;public class HighBuilding extends HouseBuilder {@Overridepublic void buildBasic() {System.out.println(" 高楼大厦打地基 ");}@Overridepublic void buildWalls() {System.out.println(" 高楼大厦打砌墙 20 cm ");}@Overridepublic void roofed() {System.out.println(" 高楼大厦的透明屋顶 ");}
}
指挥者 HouseDirector
package tanchishell.SJMS.builder2;public class HouseDirector {//组合 抽象建造者HouseBuilder houseBuilder = null;//构造器传入 houseBuilderpublic HouseDirector(HouseBuilder houseBuilder) {this.houseBuilder = houseBuilder;}//通过 setter 传入 houseBuilderpublic 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
四、建造者模式的注意事项和细节