23种设计模式【创建型模式】详细介绍之【建造者模式】

建造者模式:构建复杂对象的精妙设计

设计模式的分类和应用场景总结

可以查看专栏设计模式:设计模式

建造者模式:构建复杂对象的精妙设计

建造者模式是一种创建型设计模式,用于构建复杂对象。它将对象的构建过程与其表示分离,允许您以可控和可扩展的方式构建对象。在本文中,我们将深入探讨建造者模式,解释其核心概念,并提供Java示例代码来演示如何使用建造者模式。

建造者模式的核心思想

建造者模式的核心思想是将一个复杂对象的构建过程分为多个步骤,每个步骤由一个独立的"建造者"对象负责完成。最终,这些建造者协同工作,按顺序构建出一个完整的对象。

通过使用建造者模式,您可以在构建对象时灵活地添加、修改或删除步骤,而不会影响其他部分的代码。这种分离的方式有助于管理复杂对象的构建,提高可维护性和可读性。

建造者模式的参与者

建造者模式包含以下主要参与者:

  1. 产品(Product):要构建的复杂对象。产品通常包含多个属性和方法。

  2. 抽象建造者(Builder):定义了构建产品各个部分的接口。每个部分都有一个对应的建造方法。

  3. 具体建造者(Concrete Builder):实现了抽象建造者接口,负责构建产品的各个部分。每个具体建造者都可以构建出不同类型的产品。

  4. 指挥者(Director):负责调用具体建造者的方法,按照一定的顺序构建产品。指挥者知道如何构建一个完整的产品。

Java示例:建造者模式

让我们通过一个简单的Java示例来演示建造者模式。我们将构建一个Meal对象,包括主食、饮料和甜点。

java 复制代码
// 产品类
class Meal {
    private String mainCourse;
    private String beverage;
    private String dessert;

    public void setMainCourse(String mainCourse) {
        this.mainCourse = mainCourse;
    }

    public void setBeverage(String beverage) {
        this.beverage = beverage;
    }

    public void setDessert(String dessert) {
        this.dessert = dessert;
    }

    public void describe() {
        System.out.println("Main Course: " + mainCourse);
        System.out.println("Beverage: " + beverage);
        System.out.println("Dessert: " + dessert);
    }
}

// 抽象建造者接口
interface MealBuilder {
    void buildMainCourse();
    void buildBeverage();
    void buildDessert();
    Meal getMeal();
}

// 具体建造者实现
class VegMealBuilder implements MealBuilder {
    private Meal meal = new Meal();

    @Override
    public void buildMainCourse() {
        meal.setMainCourse("Vegetarian Burger");
    }

    @Override
    public void buildBeverage() {
        meal.setBeverage("Water");
    }

    @Override
    public void buildDessert() {
        meal.setDessert("Fruit Salad");
    }

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

class NonVegMealBuilder implements MealBuilder {
    private Meal meal = new Meal();

    @Override
    public void buildMainCourse() {
        meal.setMainCourse("Chicken Burger");
    }

    @Override
    public void buildBeverage() {
        meal.setBeverage("Coke");
    }

    @Override
    public void buildDessert() {
        meal.setDessert("Chocolate Cake");
    }

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

// 指挥者
class Waiter {
    private MealBuilder mealBuilder;

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

    public Meal constructMeal() {
        mealBuilder.buildMainCourse();
        mealBuilder.buildBeverage();
        mealBuilder.buildDessert();
        return mealBuilder.getMeal();
    }
}

public class BuilderPatternExample {
    public static void main(String[] args) {
        MealBuilder vegMealBuilder = new VegMealBuilder();
        MealBuilder nonVegMealBuilder = new NonVegMealBuilder();

        Waiter waiter1 = new Waiter(vegMealBuilder);
        Meal vegMeal = waiter1.constructMeal();
        System.out.println("Veg Meal:");
        vegMeal.describe();

        Waiter waiter2 = new Waiter(nonVegMealBuilder);
        Meal nonVegMeal = waiter2.constructMeal();
        System.out.println("Non-Veg Meal:");
        nonVegMeal.describe();
    }
}

在这个示例中,我们创建了一个Meal类作为产品。然后,我们定义了抽象建造者接口MealBuilder,并创建了两个具体建造者VegMealBuilderNonVegMealBuilder,它们分别构建了不同类型的餐点。最后,我们有一个Waiter类作为指挥者,它知道如何构建不同类型的餐点。

通过建造者模式,我们能够以可控和可扩展的方式构建不同类型的餐点,而不会使构建过程变得混乱。这提供了更好的灵活性和可维护性,尤其在构建复杂对象时非常有用。

版权声明:
原创博主:牛哄哄的柯南
博主原文链接:https://keafmd.blog.csdn.net/
个人博客链接:https://www.keafmd.top/

**看完如果对你有帮助,感谢点击下面的点赞支持!

哈哈\]\[抱拳\]** ![在这里插入图片描述](https://file.jishuzhan.net/article/1718455875590426626/01caa38286976a2e678dd2150eae0462.webp) **加油!** **共同努力!** **Keafmd** **感谢支持牛哄哄的柯南,期待你的三连+关注\~\~** **keep accumulate for my dream【共勉】** ↓ ↓ ↓ ↓ ↓ ↓

相关推荐
面朝大海,春不暖,花不开4 分钟前
自定义Spring Boot Starter的全面指南
java·spring boot·后端
得过且过的勇者y5 分钟前
Java安全点safepoint
java
夜晚回家40 分钟前
「Java基本语法」代码格式与注释规范
java·开发语言
斯普信云原生组1 小时前
Docker构建自定义的镜像
java·spring cloud·docker
wangjinjin1801 小时前
使用 IntelliJ IDEA 安装通义灵码(TONGYI Lingma)插件,进行后端 Java Spring Boot 项目的用户用例生成及常见问题处理
java·spring boot·intellij-idea
wtg44521 小时前
使用 Rest-Assured 和 TestNG 进行购物车功能的 API 自动化测试
java
白宇横流学长1 小时前
基于SpringBoot实现的大创管理系统设计与实现【源码+文档】
java·spring boot·后端
fat house cat_2 小时前
【redis】线程IO模型
java·redis
stein_java3 小时前
springMVC-10验证及国际化
java·spring
weixin_478689763 小时前
C++ 对 C 的兼容性
java·c语言·c++