定义
是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
场景举例
/**
* 有这么一个场景 一个人具有头,身子,双腿,双胳膊。需要使用建造者模式创建一个瘦人和一个胖人
* 1. 首先就这样的一个公共抽象类/接口构建头身子双腿双胳膊
* 2. 瘦人或胖人去实现或继承该接口 抽象类
* 3. 需要一个指挥类类 在客户端去 表达想要创建一个瘦人或者胖人
*/
第一步: 创建公共抽象类
abstract class PersonBuilder {
public abstract void buildHead(); // 头
public abstract void buildBody(); // 身子
public abstract void buildArmLeft(); // 左胳膊
public abstract void buildArmRight(); // 右胳膊
public abstract void buildLegLeft(); // 左腿
public abstract void buildLegRight(); // 右腿
}
第二步: 写一个瘦人类继承该抽象接口
public class PersonThinBuilder extends PersonBuilder{
@Override
public void buildHead() {
System.out.println("画瘦头");
}
@Override
public void buildBody() {
System.out.println("画瘦身子");
}
@Override
public void buildArmLeft() {
System.out.println("画瘦左胳膊");
}
@Override
public void buildArmRight() {
System.out.println("画瘦右胳膊");
}
@Override
public void buildLegLeft() {
System.out.println("画瘦左腿");
}
@Override
public void buildLegRight() {
System.out.println("画瘦右腿");
}
}
第三步: 创建一个指挥者类 让客户端使用决定构建什么样的人
public class PersonDirector {
public void createPerson(PersonBuilder pb){
pb.buildHead();
pb.buildBody();
pb.buildArmLeft();
pb.buildArmRight();
pb.buildLegLeft();
pb.buildLegRight();
}
}
第四步: 客户端实现
public static void main(String[] args) {
PersonThinBuilder personThinBuilder = new PersonThinBuilder();
PersonDirector personDirector = new PersonDirector();
personDirector.createPerson(personThinBuilder);
}
分析
将一个瘦人的创建与它实际的创建细节分离开来,无需关注构建细节,并且可以通过继承该抽象类创建不同的人,同样的构建可以创建不同的表示
优缺点
优点: 1. 封装性好,创建和使用分离 2. 扩展性好,建造类之间独立,一定程度上解耦
缺点: 如果产品内部发生变化,建造者都要修改,成本较大