侧边栏壁纸
博主头像
人生短短几个秋

行动起来,活在当下

  • 累计撰写 45 篇文章
  • 累计创建 20 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

设计模式-建造者模式

人生短短几个秋
2025-01-25 / 0 评论 / 0 点赞 / 17 阅读 / 0 字

设计模式 - 建造者模式(Builder Pattern)

介绍

建造者模式是一种创建型设计模式,它允许你逐步构造一个复杂的对象。该模式允许你使用相同的构建过程来创建不同类型和表示的对象。建造者模式的主要优点是将构建步骤与表示分离,使得构建过程更加灵活。

实现

我们以一个餐厅点餐系统为例来展示建造者模式的应用。假设餐厅的菜单上有多种套餐,每种套餐可能包含不同的食物和饮料组合。

定义产品类

首先定义一个产品类,它代表了我们要构建的复杂对象。

class Meal {
    private String food;
    private String drink;

    public Meal() {}

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

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

    @Override
    public String toString() {
        return "Meal{" +
                "food='" + food + '\'' +
                ", drink='" + drink + '\'' +
                '}';
    }
}

定义建造者接口

然后定义一个建造者接口,它声明了构建产品各个部分的方法。

interface MealBuilder {
    void buildFood();
    void buildDrink();
    Meal getMeal();
}

创建具体建造者类

接着创建具体的建造者类,它们实现了 MealBuilder 接口,并提供了具体的构建步骤。

class BurgerFriesMealBuilder implements MealBuilder {
    private Meal meal;

    public BurgerFriesMealBuilder() {
        this.meal = new Meal();
    }

    @Override
    public void buildFood() {
        meal.setFood("Burger and Fries");
    }

    @Override
    public void buildDrink() {
        meal.setDrink("Soda");
    }

    @Override
    public Meal getMeal() {
        return meal;
    }
}

class SaladSandwichMealBuilder implements MealBuilder {
    private Meal meal;

    public SaladSandwichMealBuilder() {
        this.meal = new Meal();
    }

    @Override
    public void buildFood() {
        meal.setFood("Salad Sandwich");
    }

    @Override
    public void buildDrink() {
        meal.setDrink("Juice");
    }

    @Override
    public Meal getMeal() {
        return meal;
    }
}

创建指挥者类

创建一个指挥者类,它负责指导具体的建造者对象完成产品的构建。

class Waiter {
    private MealBuilder builder;

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

    public void constructMeal() {
        builder.buildFood();
        builder.buildDrink();
    }

    public Meal getMeal() {
        return builder.getMeal();
    }
}

使用建造者模式

接下来,在主程序中使用建造者模式来创建不同的套餐。

public class Restaurant {
    public static void main(String[] args) {
        MealBuilder burgerMealBuilder = new BurgerFriesMealBuilder();
        MealBuilder saladMealBuilder = new SaladSandwichMealBuilder();

        Waiter waiter = new Waiter(burgerMealBuilder);
        waiter.constructMeal();
        Meal burgerMeal = waiter.getMeal();
        System.out.println(burgerMeal.toString()); // 输出 Meal{food='Burger and Fries', drink='Soda'}

        waiter = new Waiter(saladMealBuilder);
        waiter.constructMeal();
        Meal saladMeal = waiter.getMeal();
        System.out.println(saladMeal.toString()); // 输出 Meal{food='Salad Sandwich', drink='Juice'}
    }
}

使用场景

建造者模式适用于以下情况:

  • 如果产品内部表征复杂,则不适合使用构建函数来构造对象。
  • 如果产品内部表征将改变,则不适合使用继承来构造对象。
  • 如果初始化一个对象的过程非常复杂,或者初始化一个对象需要多个步骤。

总结

建造者模式通过将构建过程与表示分离,使得构建过程更加灵活。这种方式不仅增强了代码的可维护性和可扩展性,还能让你在不改变构建过程的前提下,创建出不同类型的对象。


以上就是建造者模式的一个实现案例,希望这篇文章能帮助你理解建造者模式的使用方式及其优势。

0

评论区