文章目录
建造者模式
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
意图:
- 将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
优点 :
- 1、建造者独立,易扩展。
- 2、便于控制细节风险。
缺点:
- 1、产品必须有共同点,范围有限制。
- 2、如内部变化复杂,会有很多的建造类。
使用场景 :
- 1、需要生成的对象具有复杂的内部结构。
- 2、需要生成的对象内部属性本身相互依赖。
注意事项:
- 与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。
角色组成:
Product
(产品角色):一个具体的产品对象,比如:House
房子AbstractBuilder
(抽象建造者):创建一个Product
对象各个部件的组成接口或者抽象类ConcreteBuilder
(具体的建造者):实现接口,构建各个部件Director
(指挥者):指定特定的建造者,由它来决定建造的时机,控制生产时机
创建hourse产品对象
public 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;
}
}
抽象建造者,定义需要创建的产品和构建流程方法
public abstract class HouseBuilder {
protected House house = new House();
//将建造的流程写好, 抽象的方法
public abstract void buildBasic();
public abstract void buildWalls();
public abstract void buildRoofed();
//建造房子好,建造者就交付给指挥者
public House returnHouse() {
return house;
}
}
具体建造者,继承和实现抽象建造者,实现自己的构造部件的方法
普通房子的建造者
public class CommonHouseBuilder extends HouseBuilder {
@Override
public void buildBasic() {
System.out.println(" 普通房子打地基5米 ");
}
@Override
public void buildWalls() {
System.out.println(" 普通房子砌墙10cm ");
}
@Override
public void buildRoofed() {
System.out.println(" 普 通房子屋顶 ");
}
}
高房子的建造者
public class HighBuildingBuilder extends HouseBuilder {
@Override
public void buildBasic() {
System.out.println(" 高楼的打地基100米 ");
}
@Override
public void buildWalls() {
System.out.println(" 高楼的砌墙20cm ");
}
@Override
public void buildRoofed() {
System.out.println(" 高楼的透明屋顶 ");
}
}
指挥者指定建造者和控制建造时机
public class HouseDirector {
//建造者
HouseBuilder houseBuilder;
//构造器传入 houseBuilder
public HouseDirector(HouseBuilder houseBuilder) {
this.houseBuilder = houseBuilder;
}
//通过setter 传入 houseBuilder
public void setHouseBuilder(HouseBuilder houseBuilder) {
this.houseBuilder = houseBuilder;
}
//如何处理建造房子的流程,交给指挥者
public House buildHouse() {
houseBuilder.buildBasic();
houseBuilder.buildWalls();
houseBuilder.buildRoofed();
return houseBuilder.returnHouse();
}
}
客户端案例
public class Client {
public static void main(String[] args) {
House house;
//盖普通房子
CommonHouseBuilder commonHouse = new CommonHouseBuilder();
//准备创建房子的指挥者
HouseDirector houseDirector = new HouseDirector(commonHouse);
//完成盖房子,返回产品(普通房子)
house = houseDirector.buildHouse();
System.out.println("--------------------------");
//盖高楼
HighBuildingBuilder highBuilding = new HighBuildingBuilder();
//重置建造者
houseDirector.setHouseBuilder(highBuilding);
//完成盖房子,返回产品(高楼)
house = houseDirector.buildHouse();
}
}
结果