当前位置: 首页 > article >正文

设计模式详解(建造者模式)

1、简述

建造者模式(Builder Pattern)是一种创建型设计模式,它通过将对象的构造过程与表示分离,使得相同的构造过程可以创建不同的表示。建造者模式尤其适用于创建复杂对象的场景。

在这里插入图片描述

2、什么是建造者模式?

建造者模式是一种创建型设计模式,主要用于以下场景:

  • 创建复杂对象时需要多个步骤。

  • 同样的构建过程可以生成不同类型的对象。

建造者模式的核心思想是通过分步骤地构建一个复杂对象,同时允许灵活地定制每个步骤的细节。

建造者模式包含以下几个核心角色:

  • 产品(Product):表示需要构建的复杂对象。

  • 建造者(Builder):定义创建产品各部分的抽象接口。

  • 具体建造者(Concrete Builder):实现 Builder 接口,完成具体产品各部分的构建。

  • 指挥者(Director):负责调用建造者的各个方法,按特定顺序创建产品。

3、实际案例

假设我们需要构建一个快餐套餐,套餐包括主食、饮料和甜品,建造者模式可以帮助我们灵活构建不同的套餐组合。

// 产品类

public class Meal {
    private String mainItem; // 主食
    private String drink;    // 饮料
    private String dessert;  // 甜品

    // Getter 和 Setter
    public String getMainItem() {
        return mainItem;
    }

    public void setMainItem(String mainItem) {
        this.mainItem = mainItem;
    }

    public String getDrink() {
        return drink;
    }

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

    public String getDessert() {
        return dessert;
    }

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

    @Override
    public String toString() {
        return "Meal [Main Item: " + mainItem + ", Drink: " + drink + ", Dessert: " + dessert + "]";
    }
}

// 抽象建造者

public interface MealBuilder {
    void buildMainItem();
    void buildDrink();
    void buildDessert();
    Meal getMeal();
}

// 具体建造者:儿童套餐

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

    @Override
    public void buildMainItem() {
        meal.setMainItem("Chicken Nuggets");
    }

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

    @Override
    public void buildDessert() {
        meal.setDessert("Ice Cream");
    }

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

// 具体建造者:健身餐

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

    @Override
    public void buildMainItem() {
        meal.setMainItem("Grilled Chicken");
    }

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

    @Override
    public void buildDessert() {
        meal.setDessert("Greek Yogurt");
    }

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

// 指挥者

public class MealDirector {
    private MealBuilder mealBuilder;

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

    public void constructMeal() {
        mealBuilder.buildMainItem();
        mealBuilder.buildDrink();
        mealBuilder.buildDessert();
    }

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

// 测试类

public class BuilderPatternDemo {
    public static void main(String[] args) {
        // 创建儿童套餐
        MealBuilder kidsMealBuilder = new KidsMealBuilder();
        MealDirector kidsMealDirector = new MealDirector(kidsMealBuilder);
        kidsMealDirector.constructMeal();
        Meal kidsMeal = kidsMealDirector.getMeal();
        System.out.println("Kids Meal: " + kidsMeal);

        // 创建健身餐
        MealBuilder fitnessMealBuilder = new FitnessMealBuilder();
        MealDirector fitnessMealDirector = new MealDirector(fitnessMealBuilder);
        fitnessMealDirector.constructMeal();
        Meal fitnessMeal = fitnessMealDirector.getMeal();
        System.out.println("Fitness Meal: " + fitnessMeal);
    }
}

输出:

Kids Meal: Meal [Main Item: Chicken Nuggets, Drink: Apple Juice, Dessert: Ice Cream]
Fitness Meal: Meal [Main Item: Grilled Chicken, Drink: Protein Shake, Dessert: Greek Yogurt]

4、建造者模式的优缺点

优点

  • 分步骤构建:将复杂对象的构造过程分解为多个步骤,代码更加清晰。

  • 灵活性:同样的构造过程可以创建不同的表示。

  • 解耦:将产品的创建过程与产品本身分离。

缺点

  • 额外的类:需要为每种产品创建具体的建造者类。

  • 复杂性增加:如果产品的构建过程过于简单,使用建造者模式可能导致不必要的复杂性。

5、应用场景

  • 构建复杂对象:如构建包含多步骤的报表、表单或配置文件。

  • UI 界面生成:如构建复杂的用户界面时,可以按步骤生成组件。

  • 代码生成工具:如编译器的代码生成模块,逐步构建复杂的语法树或代码结构。


http://www.kler.cn/a/454690.html

相关文章:

  • 「瑞仕云曜璟庭」多轨交通+成熟配套 杨浦滨江宜居之高地
  • Vite内网ip访问,两种配置方式和修改端口号教程
  • 【报错】node:internal/modules/cjs/loader:936
  • 【Three.js基础学习】33.Halftone Shading shaders
  • 【Ubuntu 20.4安装截图软件 flameshot 】
  • Django 模型中使用 `UniqueConstraint` 实现唯一性约束
  • VSCode使用deepseek-v3
  • HarmonyOS NEXT 实战之元服务:静态案例效果---我的生活记录
  • R语言森林生态系统结构、功能与稳定性分析与可视化
  • 大模型-ChatGLM-6B模型部署与微调记录
  • 如何突破迷茫,提升 Java 开发技术能力
  • NVR小程序接入平台EasyNVR视频监控技术如何助力餐饮行业实现明厨亮灶
  • 在 Spring Boot 的 MVC 框架中 路径匹配的实现 详解
  • [python学习笔记]--异常、with、assert
  • 接口Mock技术介绍
  • Exchange ProxyShell 攻击链利用详解
  • 虚拟化 | Proxmox VE 8.x 开源的虚拟化平台快速上手指南
  • 惯性动捕套装与虚拟人应用 | 激活3D虚拟人互动性与表现力
  • Day56 图论part06
  • .net core 的多线程编程
  • stm32f103zet6 i2c 四针 oled 标准库开发
  • 机试题——圣诞节礼盒
  • python监控数据处理应用服务Socket心跳解决方案
  • 树莓集团:解读资源整合是什么意思?
  • C语言基础学习记录-文件管理
  • RabbitMQ工作模式(详解 工作模式:简单队列、工作队列、公平分发以及消息应答和消息持久化)