一. 定义

  • 将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示,它关注如何一步步创建一个复杂对象。
  • 像汽车由车轮,车体,方向盘等构成,每一个部分没创建完成前,汽车也无法完成。

二. 模式构造

uTools_1687523810304.png

1. Builder(抽象建造者)

  • 抽象建造者为创建一个产品对象的各个部件指定抽象接口,该接口一般声明两类方法,一类是buikdX()用于创建复杂对象的各个部件,一类是getResykt()用于返回复杂对象。

2. ConcreteBuilder(具体建造者)

  • 实现抽象建造者

3. Product(产品角色)

  • 复杂对象,包含多个构件。

4. Director(指挥者)

  • 安排复杂对象的建造次序,指挥者与抽象建造者间为关联关系,可在其construct()方法中调用建造者对象的部件构造与装配方法,完成复杂对象的建造。客户端一般只需与指挥者交互,只需确定建造者类型并传入指挥者即可。

三. 实例

uTools_1687524780238.png

1. Meal

public class Meal {
    private String food;
    private String drink;

    public String getFood() {
        return food;
    }

    public void setFood(String food) {
        this.food = food;
    }

    public String getDrink() {
        return drink;
    }

    public void setDrink(String drink) {
        this.drink = drink;
    }
}

2. MealBuilder/MealBuilderA/MealBuilderB

public interface MealBuilder {
    Meal meal=new Meal();

    void buildFood();
    void buildDrink();
    default Meal getResult()
    {
        return meal;
    }
}
public class MealBuilderA implements MealBuilder{
    @Override
    public void buildFood() {
        meal.setFood("一个鸡腿堡");
    }

    @Override
    public void buildDrink() {
        meal.setDrink("一杯可乐");
    }
}
public class MealBuilderB implements MealBuilder{
    @Override
    public void buildFood() {
        meal.setFood("一个鸡肉卷");
    }

    @Override
    public void buildDrink() {
        meal.setDrink("一杯果汁");
    }
}

3. Waiter

public class Waiter {
    MealBuilder mb;

    public void setMealBuilder(MealBuilder mealBuilder) {
        this.mb = mealBuilder;
    }

    public Meal construct()
    {
        mb.buildFood();
        mb.buildDrink();
        return mb.getResult();
    }
}

4. client

public class Client
{
    public static void main(String[] args) throws Exception
    {
        Waiter waiter=new Waiter();
        MealBuilderA mealBuilderA=new MealBuilderA();
        waiter.setMealBuilder(mealBuilderA);
        Meal meal=waiter.construct();
        System.out.println(meal.getFood()+" "+meal.getDrink());

        MealBuilderB mealBuilderB=new MealBuilderB();
        waiter.setMealBuilder(mealBuilderB);
        meal=waiter.construct();
        System.out.println(meal.getFood()+" "+meal.getDrink());
    }
}