Java设计模式 - 建造者模式

1.定义

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

2.角色

  • Builder:建造者
  • ConcreteBuilder:具体建造者
  • Director:指挥者
  • Product:产品

3.特点

  • 优点:将产品本身与产品创建过程解耦,每一个具体建造者都相对独立,因此可以方便地替换或新增具体建造者。
  • 缺点:如果产品内部变化复杂,则需要许多具体建造者来应对这些变化而使系统变得复杂。

4.示例:KFC套餐

套餐(产品类):

public class Meal {

    public String food;
    public 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;
    }
}

抽象建造者:

public abstract class MealBuilder {

    Meal meal = new Meal();

    abstract void buildFood();
    abstract void buildDrink();

    Meal getMeal() {
        return meal;
    }
}

具体建造者:

// 套餐A
public class SubMealBuilderA extends MealBuilder {

    @Override
    void buildFood() {
        meal.setFood("薯条");
    }

    @Override
    void buildDrink() {
        meal.setDrink("奶茶");
    }
}


// 套餐B
public class SubMealBuilderB extends MealBuilder {

    @Override
    void buildFood() {
        meal.setFood("鸡翅");
    }

    @Override
    void buildDrink() {
        meal.setDrink("可乐");
    }
}

服务员(指挥者):

public class Waiter {

    public MealBuilder mealBuilder;

    public Waiter(MealBuilder mealBuilder) {
        this.mealBuilder = mealBuilder;
    }

    public Meal construct() {
        mealBuilder.buildDrink();
        mealBuilder.buildFood();
        return mealBuilder.getMeal();
    }
}

测试类:

public class TestBuilder {

    public static void main(String[] args) {

        MealBuilder mealBuilder = new SubMealBuilderA();
        Waiter waiter = new Waiter(mealBuilder);
        Meal meal = waiter.construct();
        System.out.println(meal.getFood());
        System.out.println(meal.getDrink());
    }
}

// 输出
// 薯条
// 奶茶

 

参考:

1. 《Head First 设计模式》

2. 《图说设计模式》 https://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/builder.html

3. https://blog.csdn.net/qq_34337272/article/details/80540059

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值