一、基本介绍
建造者模式是一种对象的构建模式,他可以将复杂对象的创建过程抽象出来
二、建造者的角色
- Product(产品):具体产品对象
- Builder(抽象建造者):创建product对象各个部件的接口/抽象类
- ConcreteBuilder(具体建造者):实现抽象建造者的抽象方法,有具体的建造方法
- Director(指挥者):依赖一个使用Builder接口的对象,用于创建一个复杂的对象;两个作用:隔离了 客户与对象的生产过程;负责控制产品对象的生产过程。
三、建造者模式类图

建造者模式类图
四、建造者模式-建房子例子
步骤一:创建产品类-一个房子类
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;
}
}
步骤二:创建抽象建造者
/**
* @Date: 2022/7/21
* @Desc: 抽象构造者
**/
public abstract class HouseBuilder {
private House house = new House();
//建造流程的抽象方法
public abstract HouseBuilder buildBasic();
public abstract HouseBuilder buildWalls();
public abstract HouseBuilder buildRoofed();
public House build(){
return house;
}
}
步骤三:创建具体建造者
/**
* @Date: 2022/7/21
* @Desc: 普通房子(具体建造者)
**/
public class CommonHouseBuilder extends HouseBuilder{
@Override
public HouseBuilder buildBasic() {
System.out.println("普通房子地基2米");
return this;
}
@Override
public HouseBuilder buildWalls() {
System.out.println("普通房子墙厚0.4米");
return this;
}
@Override
public HouseBuilder buildRoofed() {
System.out.println("普通房子屋顶");
return this;
}
}
步骤四:创建指导类
/**
* @Date: 2022/7/21
* @Desc: 建造指挥者
**/
public class HouseDirector {
HouseBuilder houseBuilder = null;
public HouseDirector(HouseBuilder houseBuilder) {
this.houseBuilder = houseBuilder;
}
public void setHouseBuilder(HouseBuilder houseBuilder) {
this.houseBuilder = houseBuilder;
}
public House constructHouse(){
House house = houseBuilder.buildBasic()
.buildRoofed()
.buildWalls()
.build();
return house;
}
}
最后使用
public class Client {
public static void main(String[] args) {
CommonHouseBuilder commonHouseBuilder = new CommonHouseBuilder();
HouseDirector director = new HouseDirector(commonHouseBuilder);
director.constructHouse();//建造房子
}
}
五、总结
- 客户端不需要知道产品内部的组成细节,将产品本身和创建过程解耦,使用相同的创建过程可以创建不同的产品对象
- 建造者模式适合产品建造过程相同,如果产品之间差异过大不适合建造者模式;
- 每个建造者都是独立的;增加新的具体建造者无需修改原有库代码,系统扩展方便,符合” 开闭原则“