java设计模式学习之【建造者模式】
文章目录
- 引言
- 建造者模式简介
- 定义与用途
- 实现方式:
- 使用场景
- 优势与劣势
- 建造者模式在spring中的应用
- CD(光盘)的模拟示例
- UML
- 订单系统的模拟示例
- UML
- 代码地址
引言
建造者模式在创建复杂对象时展现出其强大的能力,特别是当这些对象需要通过多个步骤来构建时。这种模式使得对象的构造过程更加清晰、灵活,同时还有助于保持创建逻辑的封装和代码的整洁。
建造者模式简介
定义与用途
建造者模式是一种创建型设计模式,它允许将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。这种模式常用于构建复杂对象,特别是当这些对象的创建过程需要多个步骤时。
实现方式:
建造者模式通常包括以下几个角色:
- Builder:为创建一个产品对象的各个部件指定抽象接口。
- ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件。定义并明确它所创建的表示,并提供一个检索产品的接口。
- Director:构造一个使用Builder接口的对象。
- Product:表示被构造的复杂对象。
使用场景
- 当需要生成的对象具有复杂的内部结构时。
- 当需要生成的对象的属性相互依赖时。
- 当创建对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
优势与劣势
- 优势
分离产品的构造和表示:提供更好的控制过程。
更好的可扩展性:可以更容易地改变一个对象的内部表示。 - 劣势
增加了系统的复杂性:需要定义多个Builder。
建造者模式在spring中的应用
在Spring框架中,建造者模式并没有像单例模式或原型模式那样被显著地用作框架的基础结构。不过,Spring确实提供了一些支持建造者模式的特性,尤其是在配置和Bean的构建方面。以下是Spring中建造者模式应用的一些例子:
Spring的链式配置:
Spring框架中的一些组件,如RestTemplateBuilder、SpringApplicationBuilder等,使用了建造者模式的思想,允许开发者通过链式调用方法来配置对象。这种方式简化了对象的构造过程,并使配置过程更加直观和易于理解。Bean的构建和配置:
在Spring中,尽管Bean的构建大多是基于工厂模式,但可以利用建造者模式来构建复杂的Bean。特别是当Bean有多个属性需要配置,且这些属性之间存在依赖关系时,建造者模式可以提供更清晰和更可维护的方式来构建这些Bean。Fluent API设计:
Spring 5 引入的WebFlux模块在其Fluent API中广泛采用了建造者模式,使得构建反应式流和请求处理流水线更加直观和便捷。
CD(光盘)的模拟示例
展示了如何使用建造者模式构建一个复杂的产品(这里是CD),包括其不同的品牌和包装。
UML

步骤 1: 创建 Packing 接口 (Packing.java):
定义了产品(CD)的包装和定价的接口。这个接口提供了pack()和price()两个方法,分别用于获取产品的包装信息和价格。
public interface Packing {public String pack();public int price();
}
步骤 2: 创建 CD 和 Company 抽象类 (CD.java 和 Company.java):
CD 类实现了 Packing 接口,提供了关于CD包装的基本实现。
Company 类继承自 CD 类,增加了关于价格的抽象方法。这个类代表生产CD的不同公司。
public abstract class CD implements Packing {public abstract String pack();
}
public abstract class Company extends CD{public abstract int price();
}
步骤3: 创建 Company 的具体实现类:Sony 和 Samsung (Sony.java 和 Samsung.java):
这两个类提供了Sony和Samsung公司生产的CD的具体实现。它们覆盖了价格和包装的方法,为Sony CD和Samsung CD分别提供了具体的价格和包装信息。
public class Samsung extends Company {@Overridepublic int price() {return 15;}@Overridepublic String pack() {return "Samsung CD";}}
public class Sony extends Company {@Overridepublic int price() {return 20;}@Overridepublic String pack() {return "Sony CD";}}
步骤4: 创建 CDType 类 (CDType.java):
这个类管理一系列的CD产品。它使用一个列表来存储Packing类型的对象,并提供了添加CD和显示CD信息的方法。
public class CDType {private List<Packing> items = new ArrayList<Packing>();public void addItem(Packing packs) {items.add(packs);}public void showItems() {for (Packing packing : items) {System.out.print("CD name : " + packing.pack());System.out.println(", Price : " + packing.price());}}}
步骤5: 创建 CDBuilder 类 (CDBuilder.java):
这个类充当建造者,提供了构建特定品牌CD的方法。buildSonyCD和buildSamsungCD方法分别创建含有Sony和Samsung CD的CDType对象。
public class CDBuilder {public CDType buildSonyCD() {CDType cds = new CDType();cds.addItem(new Sony());return cds;}public CDType buildSamsungCD() {CDType cds = new CDType();cds.addItem(new Samsung());return cds;}}
步骤6: 创建 BuilderDemo 类 (BuilderDemo.java):
这是一个演示类,它使用CDBuilder来创建不同品牌的CD集合,并展示这些CD的信息。
public class BuilderDemo {public static void main(String args[]) {CDBuilder cdBuilder = new CDBuilder();CDType cdType1 = cdBuilder.buildSonyCD();cdType1.showItems();CDType cdType2 = cdBuilder.buildSamsungCD();cdType2.showItems();}}
以上就是一个简单的建造者模式示例代码,运行代码我们可以看到。

订单系统的模拟示例
以上例子比较简单,相信大家意犹未尽
因此我又找了一个更好了,供大家品鉴
这个示例通过一个比萨饼和冷饮的订单系统,展示了建造者模式在现实世界的应用。它允许用户根据自己的选择定制不同种类和大小的比萨饼和冷饮,并在最后提供了一个总的订单和成本计算。这种方式使得订单的创建过程变得灵活且结构化,同时也保持了代码的清晰和易于管理。
UML


由于代码比较多我就不粘贴了,详情见github
代码地址
23种设计模式相关代码后续会逐步提交到github上,方便学习,欢迎指点:
代码地址
https://github.com/RuofeiSun/lf-23Pattern
相关文章:
java设计模式学习之【建造者模式】
文章目录 引言建造者模式简介定义与用途实现方式: 使用场景优势与劣势建造者模式在spring中的应用CD(光盘)的模拟示例UML 订单系统的模拟示例UML 代码地址 引言 建造者模式在创建复杂对象时展现出其强大的能力,特别是当这些对象需…...
Spring Boot中的RabbitMQ死信队列魔法:从异常到延迟,一网打尽【RabbitMQ实战 一】
Spring Boot中的RabbitMQ死信队列魔法:从异常到延迟,一网打尽 前言第一:基础整合实现第二:处理消息消费异常第三:实现延迟消息处理第四:优雅的消息重试机制第五:异步处理超时消息第六࿱…...
nrm : 镜像源工具npm镜像切换
nrm命令 安装nrm:npm i -g nrm 查看镜像源:nrm ls,带*号的为当前使用的源 添加新镜像:nrm add [镜像源名称] <源的URL路径> 切换镜像源:nrm use [镜像源名称] 删除一个镜像源:nrm del [镜像源名称] …...
Star 10.4k!推荐一款国产跨平台、轻量级的文本编辑器,内置代码对比功能
notepad 相信大家从学习这一行就开始用了,它是开发者/互联网行业的上班族使用率最高的一款轻量级文本编辑器。但是它只能在Windows上进行使用,而且正常来说是收费的(虽然用的是pj的)。 对于想在MacOS、Linux上想使用,…...
iOS 17.2:可以修改消息提示音了
时隔2周之后,苹果今日为开发者预览版用户推送了iOS 17.2 Beta4测试版的更新,已经注册Apple Beta版软件计划的用户只需打开设置--通用--软件更新即可在线OTA升级至最新的iOS 17.2测试版。 本次更新包大小为590M左右,内部版本号为(…...
PTA 一维数组7-3出生年(本题请你根据要求,自动填充“我出生于y年,直到x岁才遇到n个数字都不相同的年份”这句话)
以上是新浪微博中一奇葩贴:“我出生于1988年,直到25岁才遇到4个数字都不相同的年份。”也就是说,直到2013年才达到“4个数字都不相同”的要求。本题请你根据要求,自动填充“我出生于y年,直到x岁才遇到n个数字都不相同的…...
【3】基于多设计模式下的同步异步日志系统-设计模式
详细介绍设计模式 单例模式 ⼀个类只能创建⼀个对象,即单例模式,该设计模式可以保证系统中该类只有⼀个实例,并提供⼀个访问它的全局访问点,该实例被所有程序模块共享。⽐如在某个服务器程序中,该服务器的配置信息存放…...
Metasploit的使用和配置
预计更新 第一章 Metasploit的使用和配置 1.1 安装和配置Metasploit 1.2 Metasploit的基础命令和选项 1.3 高级选项和配置 第二章 渗透测试的漏洞利用和攻击方法 1.1 渗透测试中常见的漏洞类型和利用方法 1.2 Metasploit的漏洞利用模块和选项 1.3 模块编写和自定义 第三章 Me…...
测试用例的设计思路
接到提测单后要做的事情: 测试准备阶段 确认提测单内包含的文件、URL地址可以访问确认需求 (迭代目标、用户故事、用户愿望、问题反馈等)确认回归测试范围、更新测试范围、新增测试范围编写测试点思维导图,过程中有问题及时进行沟通与迭代相关人员约一个…...
HCIP——交换综合实验
一、实验拓扑图 二、实验需求 1、PC1和PC3所在接口为access,属于vlan2;PC2/4/5/6处于同一网段,其中PC2可以访问PC4/5/6;但PC4可以访问PC5,不能访问PC6 2、PC5不能访问PC6 3、PC1/3与PC2/4/5/6/不在同一网段 4、所有PC通…...
大学生如何搭建自己的网站
这篇是我在大一的时候,写过的一篇文章。 前言 作为一名大学生,我觉得搭建个人网站很有意义。 这篇博客讲述的是这个寒假,我是如何从零到搭建好个人网站的过程。我提供的主要是具体的思路,也附带了一些零零散散的细节。时间跨度…...
linux 路由表的优先级
[rootlocalhost cc]# ip rule list 0: from all lookup local 32765: from 10.0.19.24 lookup 4096 32766: from all lookup main 32767: from all lookup default 现在有 4 条路由规则,优先级是怎样的,0 代表最低优先级还是最高优先级 在 Linux 的 IP …...
毕业项目分享
大家好,今天给大家分享112个有趣的Python实战项目,可以直接拿来实战练习,涵盖机器学习、爬虫、数据分析、数据可视化、大数据等内容,建议关注、收藏。 项目名称 主要技术 2023招聘数据分析可视化系统爬虫 7种薪资预测模型 Flas…...
Android启动系列之进程杀手--lmkd
本文概要 这是Android系统启动的第三篇文章,本文以自述的方式来讲解lmkd进程,通过本文您将了解到lmkd进程在安卓系统中存在的意义,以及它是如何杀进程的。(文中的代码是基于android13) 我是谁 init:“大…...
tex中的边框
文章目录 利用tcolorbox宏包给公式加框 利用tcolorbox宏包 tcolorbox可以创建一个盒子的环境,例如: \documentclass{article} \usepackage{tcolorbox} \begin{document}\begin{tcolorbox}[left1cm, right1cm, top0.5cm, bottom0.5cm,colbackblue!10!wh…...
面试题库之JAVA基础篇(三)
final 被final修饰的类不可以被继承。被final修改的方法不可以被重写。被final修改的方法,jvm会尝试内联,以提高运行效率。被final修改的变量不可变,如果修改的是引用,那么引用不可变,引用指向的对象内容可变。被fin…...
CTF-虚拟机-QEMU-前置知识-操作流程与源码阅读
文章目录 总览内存PCI设备PCI配置空间前64个字节对应源码Memorry空间的BARIO空间的BAR MMIOPMIOIspci访问PCI设备配置空间中的Memory空间和IO空间MMIOPMIO QQM(qemu object model)简洁概要将 TypeInfo 注册 TypeImpl:ObjectClass的初始化&…...
java成神秘籍第一卷
前言 适合还没有入行小白学习,有些朋友会跑来问我这行的一些问题,下面算是详细系统的整理了一下啦。 全当是学习 复盘 整理 记录了 java成神秘籍第一卷 前言一 前提1 要不要考公,考编,考研2 语言选择3 就业岗位4 目标5 考不考虑…...
golang实现文件上传(高并发+分块+断点续传+加密)
运行视频 // todo 根据前端传递文件加密 func (s *FileProcess) FileProcessEncryptionByFront(file multipart.File, h *multipart.FileHeader) interface{} { //根据字节直接处理文件 这个是前端传递的二进制流s.FileProcessInit() //文件初始化 设置原来文件…...
用HeidiSQL在MySQL中新建用户
用HeidiSQL登录到MySQL数据库,注意登录的时候要使用有权限的用户: 选择工具-》用户管理: 点击左上角的“添加”: 输入用户名、密码,并且分配权限: 点击右边的“添加对象”: 可以根据自己…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...
