建造者模式详解

建造者模式(Builder Pattern)是一种创建型设计模式,它将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。以下是建造者模式的详细解释:
建造者模式的角色组成:
1.  产品类(Product):要创建的复杂对象。
2.  抽象建造者类(Builder):这个接口规定要实现复杂对象的那些部分的创建,并不涉及具体的部件对象的创建。
3.  具体建造者类(ConcreteBuilder):实现Builder接口,完成复杂产品的各个部件的具体创建方法。在构造过程完成后,提供产品的实例。
4.  指挥者(Director):调用建造者中的方法完成复杂对象的创建,它负责安排已有模块的顺序和构建过程。
建造者模式的优点:
1.  灵活性:可以分步骤地构建复杂对象,使得构建过程更加灵活。
2.  解耦:可以隔离复杂对象的创建和使用,客户端不必关心对象的创建细节。
3.  易扩展:增加新的具体建造者很方便,可以扩展构建器功能,符合开闭原则。
建造者模式的缺点:
1.  增加工作量:需要额外的代码来创建和管理具体建造者类,增加了程序员的工作量。
2.  效率低:相比于其他创建型模式,在运行时效率较低,特别是对象太复杂时。
建造者模式的应用场景:
1.  创建复杂对象:当对象的构建过程比较复杂且需要多个步骤时,例如,创建一份电子商务订单需要多个步骤,如选择商品、填写地址和支付等,这些步骤可以被分别封装成为订单构建器中的不同方法。
2.  多步配置对象:当需要创建一些特定类型的对象,例如复杂的数据结构或配置对象时,这在编写配置文件解析器以及通用数据结构如二叉树等时很有用。
3.  多变的配置对象:当创建的对象较复杂,由多个部件构成,各部件面临着复杂的变化,但将它们组合在一起的算法却相对稳定。
建造者模式的代码实现:
以下是一个简单的建造者模式的代码实现,以一个餐厅的订单系统为例,顾客可以通过不同的选项来定制他们的餐点:
// 餐点类
class Meal {
    private String mainCourse;
    private String drink;
    private String dessert;

    // 省略setter和getter方法

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

// 建造者接口
interface MealBuilder {
    void buildMainCourse(String mainCourse);
    void buildDrink(String drink);
    void buildDessert(String dessert);
    Meal build();
}

// 具体建造者
class ConcreteMealBuilder implements MealBuilder {
    private Meal meal;

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

    @Override
    public void buildMainCourse(String mainCourse) {
        meal.setMainCourse(mainCourse);
    }

    @Override
    public void buildDrink(String drink) {
        meal.setDrink(drink);
    }

    @Override
    public void buildDessert(String dessert) {
        meal.setDessert(dessert);
    }

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

// 指挥者类
class MealDirector {
    private MealBuilder builder;

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

    public Meal constructMeal(String mainCourse, String drink, String dessert) {
        builder.buildMainCourse(mainCourse);
        builder.buildDrink(drink);
        builder.buildDessert(dessert);
        return builder.build();
    }
}

// 客户端使用
public class Client {
    public static void main(String[] args) {
        MealBuilder builder = new ConcreteMealBuilder();
        MealDirector director = new MealDirector(builder);
        Meal meal = director.constructMeal("Steak", "Wine", "Cheesecake");
        System.out.println(meal);
    }
}

在这个例子中,Meal 类代表餐点,MealBuilder 是建造者接口,ConcreteMealBuilder 是具体建造者,MealDirector 是指挥者,Client 是客户端使用示例。通过建造者模式,可以根据顾客的选择构建不同的餐点,同时保持代码的灵活性和可维护性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/945157.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用IDEA远程debug服务器上的jar包

仅用于测试环境调试,debug会阻塞 如生产jar包叫 test.jar ,部署的IP为10.184.136.18,端口为9999,idea的项目为local-network,照如下配置即可,仅红色部分需替换 弄完之后,打开debug,…

【SQL Server】教材数据库(3)

接着教材数据库(1)的内容,完成下列查询。 1 查询订购高等教育出版社教材的学生姓名 2 查询比所有高等教育出版社的图书都贵的图书信息 3 列出每位学生姓名、订购教材书名、价格。 1、嵌套查询:use jiaocai select student.nam…

你有哪些Deep Learning(RNN、CNN)调参的经验?

在深度学习的实践中,调参是一项既艺术又科学的工作。它不仅需要理论知识的支撑,还需要大量的实践经验。以下是一些在RNN和CNN模型调参中积累的经验,希望对正在这个领域摸索的朋友们有所帮助。 1. 从成熟的开源项目开始 对于初学者来说&…

Unity3D仿星露谷物语开发11之添加Scenary Fader

1、目标 当角色移动到草/树的后面时,因为草/树层级优先级大于等于角色,导致角色无法全部展示。 如下图所示,草遮挡了一半的角色,而树则遮挡了全部的角色。 我们希望当角色走到草/树的后面时,草/树能够改变透明度&…

021-spring-springmvc

比较重要的部分 比较重要的部分 比较重要的部分 关于组件的部分 这里以 RequestMappingHandlerMapping 为例子 默认的3个组件是: org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping org.springframework.web.servlet.mvc.method.annotation.Requ…

关于 PCB线路板细节锣槽问题 的解决方法

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/144783817 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…

无人机快速巡检、森林、电力、水利大大节省人力成本,降低风险事故

无人机在快速巡检、森林、电力、水利等领域的应用,确实大大节省了人力成本,并有效降低了风险事故。以下是对这些应用的详细分析: 一、无人机快速巡检 无人机快速巡检技术以其高效性、安全性和精准性,在众多领域展现出了巨大的应…

生态碳汇涡度相关监测与通量数据分析实践技术应用

基于MATLAB语言、以实践案例为主,提供所有代码、原理与操作结合 1、以涡度通量塔的高频观测数据为例,基于MATLAB开展上机操作: 2、涡度通量观测基本概况:观测技术方法、数据获取与预处理等 3、涡度通量数据质量控制&#xff1a…

【Lua之·Lua与C/C++交互·Lua CAPI访问栈操作】

系列文章目录 文章目录 前言一、概述1.1 Lua堆栈 二、栈操作2.1 基本的栈操作2.2 入栈操作函数2.3 出栈操作函数2.4 既入栈又出栈的操作函数2.5 栈检查与类型转换函数2.5 获取表数据 三、实例演示总结 前言 Lua是一种轻量级的、高性能的脚本语言,经常被用于游戏开发…

安装OpenGauss数据库流程

一、安装完欧拉系统将yum上传至本地: 创建文件 mkdir /media/iso 挂载镜像 mount /dev/sr0 /media/iso 未通网情况,删除自带的yum,创建一个新的 cd /etc/yum.repos.d/ rm -r 加yum文件名称 (删除自带yum) v…

Go语言zero项目服务恢复与迁移文档

## 一. 服务器环境配置 在迁移和配置 项目时,首先需要确保服务器环境正确配置。以下是配置步骤: ### 1. 安装 Go 语言环境 首先,确保 Go 语言环境已经安装,并且配置正确。执行以下步骤: # 下载 Go 语言安装包 wge…

【 Sonarqube】可视化Java项目单元测试覆盖率统计框架搭建

一、项目背景: 一个小公司的朋友反应他们那边Java项目单元测试有,但还没有可视化统计覆盖率数据,没法统计就不能直观的看到单测的覆盖率,Java的覆盖率统计框架还是比较成熟,部署起来也不是很难,下面我们逐…

使用ForceBindIP绑定应用到指定IP

前言 使用ForceBindIP工具,用户可以轻松地将特定应用程序绑定到指定的IP地址,从而确保应用程序的网络连接通过指定的网络适配器进行。通过在命令提示符下运行ForceBindIP并指定IP地址和应用程序的完整路径,用户能够控制应用程序的网络流量&a…

Webpack学习笔记(6)

首先搭建一个基本的webpack环境: 执行npm init -y,创建pack.json,保存安装包的一些信息 执行npm install webpack webpack-cli webpack-dev-server html-webpack-plugin -D,出现node_modules和package-lock.json。 1.source-Ma…

【学生管理系统】element ui级联菜单bug

级联后端 通过父id来进行查询 GetMapping("/{parentId}")public BaseResult findAllByParentId(PathVariable("parentId") String parentId){//1 根据父id查询所有城市QueryWrapper<TbCity> queryWrapper new QueryWrapper<>();queryWrapper.…

关于无线AP信道调整的优化(锐捷)

目录 一、信道优化的基本原则二、2.4G频段信道优化三、5G频段信道优化四、信道优化代码具体示例五、其他优化措施 一、信道优化的基本原则 信道优化旨在减少信道间的干扰&#xff0c;提高网络覆盖范围和信号质量。基本原则包括&#xff1a; 1. 选择合适的信道&#xff1a;根据…

Ubuntu 下使用命令行将 U 盘格式化为 ext4、FAT32 和 exFAT 的详细教程

Ubuntu 下使用命令行将 U 盘格式化为 ext4、FAT32 和 exFAT 的详细教程 作者&#xff1a;Witheart更新时间&#xff1a;20241228 本教程将详细介绍如何将 U 盘格式化为 ext4、FAT32 和 exFAT 文件系统&#xff0c;同时包括如何安装必要工具&#xff08;如 exfat-utils&#x…

【设计与实现】基于Bootstrap的地方旅游管理系统的设计与实现

目录 第一章 绪论 1.1 研究现状 1.2 设计原则 1.3 研究内容 第四章 系统设计 4.1系统结构设计 4.2系统顺序图设计 4.3数据库设计 第五章 系统实现 5.1登录模块的实现 第一章 绪论 1.1 研究现状 时代的发展&#xff0c;我们迎来了数字化信息时代&#xff0c;它正在渐…

【MySQL高级】索引

MySQL高级课程简介 序号010203041基本硬件知识体系结构应用优化MySQL 常用工具2索引存储引擎查询缓存优化MySQL 日志3视图优化SQL步骤内存管理及优化MySQL 主从复制4存储过程和函数索引使用MySQL锁问题5触发器SQL优化常用SQL技巧 1. 基本硬件知识 1.1 计算机工作原理 1.中央处…

【Redis】:初识Redis

1.1 盛赞 Redis Redis 是⼀种基于键值对&#xff08;key-value&#xff09;的 NoSQL 数据库&#xff0c;与很多键值对数据库不同的是&#xff0c;Redis 中的值可以是由 string&#xff08;字符串&#xff09;、hash&#xff08;哈希&#xff09;、list&#xff08;列表&#xf…