类图+案例+代码详解:软件设计模式----生成器模式(建造者模式)

生成器模式(建造者模式)

把复杂对象的建造过程和表示分离,让同样的建造过程可以创建不同的表示。

请添加图片描述

假设你去快餐店买汉堡,汉堡由面包、肉饼、蔬菜、酱料等部分组成。

建造者模式的角色类比:

  1. 产品(Product):汉堡
    (由多个部分组成的复杂对象)
  2. 抽象建造者(Builder):汉堡建造接口
    (定义 “放面包”“放肉饼”“放蔬菜”“放酱料” 等建造步骤)
  3. 具体建造者(ConcreteBuilder):鸡肉堡建造者、牛肉堡建造者
    (分别实现不同汉堡的建造步骤,比如鸡肉堡放鸡腿肉,牛肉堡放牛肉饼)
  4. 指挥者(Director):服务员
    (告诉建造者 “先放面包→再放肉饼→加蔬菜→加酱料”,控制建造顺序)

为什么要用建造者模式?

  • 场景对比:
    • 不用模式时: 直接 new 一个汉堡对象,要一次性传所有参数(面包类型、肉饼种类、蔬菜数量…),代码又长又容易错。
    • 用建造者模式: 像 “组装乐高” 一样,一步步造汉堡,每个步骤独立,最后由指挥者按顺序组装。

核心优势

  1. 解耦建造过程和产品表示:比如造 “豪华汉堡” 和 “普通汉堡”,可以复用相同的建造流程,只修改部分步骤。
  2. 简化复杂对象创建:避免 “巨量参数构造函数”,代码更清晰。
  3. 方便扩展新产品:新增 “素食汉堡” 时,只需新建一个建造者,不修改原有逻辑。

代码示例

// 1. 产品:汉堡  
class Hamburger {private String bread;private String meat;private String veggies;private String sauce;// 省略getter/setter,用Builder模式时很少直接操作这些字段
}// 2. 抽象建造者:定义建造步骤  
interface HamburgerBuilder {void buildBread();void buildMeat();void buildVeggies();void buildSauce();Hamburger getHamburger();
}// 3. 具体建造者:鸡肉堡建造者  
class ChickenBurgerBuilder implements HamburgerBuilder {private Hamburger hamburger = new Hamburger();@Overridepublic void buildBread() { hamburger.setBread("芝麻面包"); }@Overridepublic void buildMeat() { hamburger.setMeat("炸鸡腿肉"); }@Overridepublic void buildVeggies() { hamburger.setVeggies("生菜+番茄"); }@Overridepublic void buildSauce() { hamburger.setSauce("番茄酱"); }@Overridepublic Hamburger getHamburger() { return hamburger; }
}// 4. 指挥者:服务员,控制建造顺序  
class Waiter {private HamburgerBuilder builder;public Waiter(HamburgerBuilder builder) {this.builder = builder;}// 定义“标准汉堡”的建造流程  public Hamburger buildStandardHamburger() {builder.buildBread();builder.buildMeat();builder.buildVeggies();builder.buildSauce();return builder.getHamburger();}
}// 使用示例  
public class BuilderDemo {public static void main(String[] args) {// 要鸡肉堡?找鸡肉堡建造者+服务员  HamburgerBuilder chickenBuilder = new ChickenBurgerBuilder();Waiter waiter = new Waiter(chickenBuilder);Hamburger chickenBurger = waiter.buildStandardHamburger();System.out.println("建造了一个:" + chickenBurger.getBread() + " + " + chickenBurger.getMeat() + " + " + chickenBurger.getVeggies() + " + " + chickenBurger.getSauce());}
}
  1. 建造者模式和工厂模式的区别

    • 工厂模式:“一步到位” 创建简单对象(如直接 new 一个汉堡)。
    • 建造者模式:“分步组装” 创建复杂对象(如分步骤造汉堡的各个部分)。
  2. 实际场景举例

    • JDK 中的StringBuilder(一步步 append 字符,最后 toString ())。
    • SQL 语句构建(分步骤拼表名、条件、排序,避免 SQL 注入)。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UI前端与数字孪生融合探索:为智慧物流提供可视化解决方案

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 在全球供应链数字化转型的浪潮中,智慧物流正从概念走向落地 —— 据 MarketsandMa…

远程办公与协作新趋势:从远程桌面、VDI到边缘计算,打造高效、安全的混合办公环境

一、引言 随着数字化转型的加速,越来越多的企业开始采用远程办公和混合办公模式,以提升员工的灵活性和企业的敏捷性。然而,异地办公也带来了诸如桌面环境不一致、安全风险增加、沟通协作效率降低等诸多挑战。因此,如何打造一致、…

算法总结篇:二叉树

二叉树解题整体框架: 1、确定当前题型是做高度还是深度还是搜索树还是其他 高度(从下往上,求根深度、高度等): 使用后序遍历会更加简单,递归方法一般需要返回值返回上级,让上级对返回值进行判断…

【Elasticsearch】most_fields、best_fields、cross_fields 的区别与用法

most_fields、best_fields、cross_fields 的区别与用法 1.核心区别概述2.详细解析与用法2.1 best_fields(最佳字段匹配)2.2 most_fields(多字段匹配)2.3 cross_fields(跨字段匹配) 3.对比案例3.1 使用 best…

力扣网C语言编程题:在数组中查找目标值位置之暴力解法

一. 简介 本文记录一下力扣网上涉及数组的问题:排序数组中查找目标值的位置。主要以C语言实现。 二. 力扣网C语言编程题:在数组中查找目标值位置 题目:在排序数组中查找元素的第一个和最后一个位置 给你一个按照非递减顺序排列的整数数组 …

OSCP - Proving Grounds - tre

主要知识点 突破边界的方法比较多样观察pspy64的检测结果 具体步骤 依旧nmap扫描开始,开放了80,8082,22端口 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-12-16 03:39 UTC Nmap scan report for 192.168.56.84 Host is up (0.00083s latency). Not shown: 65532 c…

【Mars3d】支持的basemaps数组与layers数组的坐标系列举

问题场景: basemap 是epsg4326的。,layer 图层是 epsg 4450的。可以在一个页面中展示吗? 回复: 可以不同坐标系叠加,但layer 图层是 epsg 4450的只支持arcgis动态服务,其他情况的不支持 wmts只支持3个坐标…

【算法】509. 斐波那契数

509. 斐波那契数 简单 相关标签 premium lock icon 相关企业 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) 0,F(1) 1 …

FOC学习笔记(5)内嵌式电机与表贴式电机的区别

1. 引言 在现代电机设计中,永磁同步电机(Permanent Magnet Synchronous Motor, PMSM)因其高效率、高功率密度和优异的动态性能,在工业、新能源汽车、航空航天等领域得到广泛应用。根据永磁体在转子中的安装方式不同,永…

算法 按位运算

按位与(Bitwise AND)和按位异或(Bitwise XOR) 按位与(&) 按位与是对两个数的二进制表示的每一位进行逻辑与操作。 规则:两个对应位都为1时,结果位才为1,否则为0。…

python3GUI--基于PyQt5+SQLite3的网址审核系统(详细图文)

文章目录 一.前言二.相关知识1.PyQt52.sqlite3 三.效果预览1.登录2.注册3.普通用户身份权限4.管理员身份权限 三、技术讨论1.数据展示表格1. 更强的表现力和交互性(前端功能丰富)2. 数据处理效率更高(支持大…

与后端现场联调mock数据

当我们后端在现场没办法连后端本地就可以使用mock数据,模拟后端返回数据。使用工具:apifox 一、安装好以后--新建接口 举个栗子: 我想建个接口http://123.123.123.123:8080/api/login 二、 新建期望,返回固定值,否则…

C# 事件(发布者和订阅者)

发布者和订阅者 很多程序都有一个共同的需求,即当一个特定的程序事件发生时,程序的其他部分可以得到 该事件已经发生的通知。 发布者/订阅者模式(publisher/subscriber pattem)可以满足这种需求。在这种模式中,发布 …

RediSearch高性能全文搜索引擎

RediSearch 是 RedisLabs 团队开发的一个高性能全文搜索引擎,可作为一个 Redis Module 运行在 Redis 上。 Redis7:百万数据级Redis Search 超越 ElasticSearch Redis Search是基于Redis的全文搜索引擎模块(RediSearch)&#xff0c…

菜谱大全——字符串处理艺术:从文本解析到高效搜索 [特殊字符][特殊字符]

目录 前言一、现实场景二、技术映射2.1 基础刀工:String类2.2 高效剁馅:StringBuilder2.3 精准雕刻:正则表达式 三、知识点呈现3.1 String vs StringBuilder vs StringBuffer3.2 正则表达式核心语法速查3.3 字符串拼接性能陷阱 四、代码实现五…

webpack+vite前端构建工具 -答疑

webpack答疑 1 输入webpack命令,执行的是全局版本还是本地版本的webpack 当在命令行窗口输入webpack命令时,其执行优先级可通过以下步骤明确判断: 1.1 【全局安装优先机制】 执行原理:系统会按照环境变量PATH的顺序逐级查找可执…

API接口开放平台 Crabc 3.4 发布

Crabc 是一款 API 接口开发平台,企业级接口管理、SQL2API 平台。支持动态数据源、动态 SQL 和标签, 支持接入(mysql、oracle、达梦、TiDB、hive、es 和 mongodb)等 SQL 或 NoSQL 数据源,在线可视化编写 SQL 快速发布接…

PD快充协议芯片XSP04D支持全协议+支持串口通讯+支持与主板共用一个Type-C

随着Type-C接口的充电器普及,市面上的PD充电器越来越多,小家电产品可不配充电器,使用Type-C接口,然后加入一颗PD协议取电协议芯片XSP08即可让充电器/充电宝/车充等电源输出9V/12V/15V/20V电压给产品供电。 针对各种各样的不同需求…

C# 高效加载txt文件内容

在 C# 中,高效加载 TXT 文件内容可以通过多种方法实现,具体方法的选择取决于文件的大小和读取需求。以下是一些常用的方法: 1. 使用 File.ReadAllText 如果文件比较小,并且你希望一行一行地读取整个内容,可以使用 Fi…

(2)pytest执行用例的规则

1. 简介 今天主要学习一下pytest的执行用例的规则。 2. 通过help帮助查看pytest如何使用 .查看pytest命令行参数,可以用pytest -h 或pytest --help查看 3. 用例设计原则 文件名以test_*.py文件和*_test.py以test_开头的函数以Test开头的类以test_开头的方法所有的…