定义
建造者模式:将一个复杂的对象的 生成,拆解成 多个 小的对象的构造,从而达到 由于各个小部件的构造不同最终生成的对象 灵活可变的效果;(对象的组成是不变的,具体的组成部分内部可以灵活变化)
优缺点
优点
- 对象的构建和展示 分离
- 不同的业务场景 使用的 建造者 不一样,独立 解耦;扩展性好
- 调用者 不需要了解 对象的具体建造过程,交给具体的建造者就行;对调用者更友好
缺点
- 对象的内部构成必须一样;有一定的局限性
- 如果 随着 业务逻辑的迭代,对象组成有变化;所有的 关联建造者实现 都需要进行修改,成本较大
适用场景
- 类复杂性较高,且需要的 属性值 变化较大
主要组成结构
产品:最终要生成的对象实例(包含多个属性的 复杂对象)
抽象建造者:包含 构造 各个属性对象的 抽象方法及返回产品的 抽象类或接口
具体建造者:实现产品对象 各个属性 实例创建逻辑
调度者:调用 具体建造者类 生成复杂对象的 逻辑类
类图
代码实现
public class BuilderPattern {
public static void main(String[] args) {
Builder builder = new RealBuilder();
Salesperson director = new Salesperson(builder);
Meal product = director.construct();
product.ok();
}
}
/**
* 需求:
* 麦当劳点餐
* 一个汉堡、一杯可乐、一个鸡米花
*/
/**
* product 产品 套餐
*/
class Meal {
private String stapleFood;
private String drink;
private String snack;
public Meal() {
}
public String getStapleFood() {
return stapleFood;
}
public void setStapleFood(String stapleFood) {
this.stapleFood = stapleFood;
}
public String getDrink() {
return drink;
}
public void setDrink(String drink) {
this.drink = drink;
}
public String getSnack() {
return snack;
}
public void setSnack(String snack) {
this.snack = snack;
}
public void ok(){
System.out.println(drink);
System.out.println(snack);
System.out.println(stapleFood);
System.out.println("上菜");
}
}
/**
* Director 调用者 销售前台
*/
class Salesperson {
private final Builder builder;
public Salesperson(Builder builder) {
this.builder = builder;
}
public Meal construct(){
builder.buildDrink();
builder.buildStapleFood();
builder.buildSnack();
return builder.getResult();
}
}
/**
* 大厨 生产者
*/
abstract class Builder{
Meal product = new Meal();
public abstract void buildStapleFood();
public abstract void buildDrink();
public abstract void buildSnack();
public Meal getResult(){
return product;
}
}
/**
* 实际建造者
*/
class RealBuilder extends Builder{
@Override
public void buildStapleFood() {
product.setStapleFood("汉堡做好了");
}
@Override
public void buildDrink() {
product.setDrink("可乐做好了");
}
@Override
public void buildSnack() {
product.setSnack("鸡米花做好了");
}
}
result
可乐做好了
鸡米花做好了
汉堡做好了
上菜