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数据库,注意登录的时候要使用有权限的用户: 选择工具-》用户管理: 点击左上角的“添加”: 输入用户名、密码,并且分配权限: 点击右边的“添加对象”: 可以根据自己…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
