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/

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


加油!

共同努力!

Keafmd

感谢支持牛哄哄的柯南,期待你的三连+关注~~

keep accumulate for my dream【共勉】

↓ ↓ ↓ ↓ ↓ ↓

相关推荐
狼爷14 小时前
吃透 Java Function 接口,搞定 99% 的 Stream 场景
java·函数式编程
祎雪双十Gy19 小时前
从 DataX 的配置加载说起:我用 FastJson2 做了一个轻量级动态配置管理库
java·后端
小锋java123419 小时前
分享一套锋哥原创的SpringBoot4+Vue3宠物领养网站系统
java
考虑考虑1 天前
Java实现hmacsha1加密算法
java·后端·java ee
掉鱼的猫1 天前
Spring Boot → Solon 注解迁移实战指南:一张对照表说清楚
java·spring boot
plainGeekDev1 天前
广播接收器 → Flow + Lifecycle
android·java·kotlin
plainGeekDev1 天前
EventBus → SharedFlow
android·java·kotlin
带刺的坐椅1 天前
Spring Boot → Solon 注解迁移实战指南:一张对照表说清楚
java·springboot·web·solon
青禾网络1 天前
Web 前端如何接入 AI 音效生成:从零到可用的完整方案
人工智能·设计模式
用户3721574261351 天前
Java 将一个 PPT 文档拆分为多个文件
java