【Java 设计模式】23 种设计模式
文章目录
- 设计模式是什么
- 计算机行业里的设计模式
- 创建型模式(共 5 种)
- 结构型模式(共 7 种)
- 行为型模式(共 11 种)
- 总结
设计模式是什么
“每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必重复劳动。”
----- Christopher Alexander
Alexander 是 20 世纪 70 年代的一位著名的建筑师 ,他为了解决同一个问题而设计出的不同版本的建筑结构,突然发现了这些高质量的设计中都具有着相似部分,然后他就把这些相似的部分提炼出来,总结成了一套经验,留着后续再设计时使用。
计算机行业里的设计模式
设计模式是在软件设计中经常出现的问题的解决方案,它们是经验丰富的开发人员通过时间和实践总结出来的最佳实践。
✨说白一点
它就是一套经过前人踩坑之后,总结出来的一套被反反复复使用的解决方案,
也即,前人栽树,后人乘凉。
在 Java 中,我们有幸继承了许多经典的设计模式,其中最著名的是《设计模式:可复用面向对象软件的基础》一书中总结的 23 种设计模式。这些设计模式可以分为三大类:创建型模式、结构型模式和行为型模式,本文我们将简要概述一下这些设计模式。
创建型模式(共 5 种)
- 单例模式(Singleton Pattern)
- 保证一个类仅有一个实例,并提供一个访问它的全局点
- 示例:
java.lang.Runtime
、数据库连接池
- 工厂方法模式(Factory Method Pattern)
- 定义一个用于创建对象的接口,但是由子类决定实例化哪一个类
- 示例:
java.util.Calendar
、java.util.Collection
- 抽象工厂模式(Abstract Factory Pattern)
- 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类
- 示例:
javax.xml.parsers.DocumentBuilderFactory
- 建造者模式(Builder Pattern)
- 将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示
- 示例:
java.lang.StringBuilder
、java.lang.StringBuffer
- 原型模式(Prototype Pattern)
- 通过复制现有的对象来创建新对象,而不是从头开始创建
- 示例:
java.lang.Object#clone()
结构型模式(共 7 种)
- 适配器模式(Adapter Pattern)
- 将一个类的接口转换成客户希望的另外一个接口
- 示例:
java.util.Arrays#asList()
- 桥接模式(Bridge Pattern)
- 将抽象部分与它的实现部分分离,使它们都可以独立地变化
- 示例:
java.util.logging
- 组合模式(Composite Pattern)
- 将对象以树形结构组合以表示“部分-整体”的层次结构
- 示例:
java.awt.Container
、javax.swing.JComponent
- 装饰器模式(Decorator Pattern)
- 动态地给一个对象添加一些额外的职责
- 示例:
java.io.InputStream
- 外观模式(Facade Pattern)
- 为子系统中的一组接口提供一个一致的界面
- 示例:
java.net.URL
、javax.faces.webapp.FacesServlet
- 代理模式(Proxy Pattern)
- 为其他对象提供一种代理以控制对这个对象的访问
- 示例:
java.lang.reflect.Proxy
、java.rmi.*
- 享元模式(Flyweight Pattern)
- 用共享的方式高效地支持大量小粒度对象。
- 示例:
java.lang.Integer#valueOf(int)
、java.lang.String#intern()
行为型模式(共 11 种)
- 观察者模式(Observer Pattern)
- 定义对象间的一对多依赖,当一个对象改变状态,所有依赖者都会受到通知并自动更新
- 示例:
java.util.Observer
、java.util.Observable
- 策略模式(Strategy Pattern)
- 定义一系列算法,将它们封装起来,并且使它们可以相互替换
- 示例:
java.util.Comparator
、java.util.Arrays#sort()
- 命令模式(Command Pattern)
- 将请求封装成对象,使得可以用不同的请求对客户进行参数化
- 示例:
java.lang.Runnable
、javax.swing.Action
- 状态模式(State Pattern)
- 允许对象在其内部状态改变时改变它的行为
- 示例:
java.util.Iterator
、javax.faces.lifecycle.Lifecycle
- 责任链模式(Chain of Responsibility Pattern)
- 为解除请求的发送者和接收者之间的耦合,而使多个对象都有机会处理这个请求
- 示例:
java.util.logging.Logger#log()
- 访问者模式(Visitor Pattern)
- 将算法与对象结构分离,并且可以在不改变对象结构的前提下定义新的操作
- 示例:
javax.lang.model.element.Element
、javax.lang.model.element.ElementVisitor
- 中介者模式(Mediator Pattern)
- 用一个中介对象来封装一系列的对象交互
- 示例:
java.util.Timer
、java.util.concurrent.Executor
- 备忘录模式(Memento Pattern)
- 在不破坏封装的情况下,捕获对象的内部状态,并在对象之外保存这个状态
- 示例:
java.util.Date
- 迭代器模式(Iterator Pattern)
- 提供一种方法顺序访问一个聚合对象中的各个元素,而不暴露其内部表示
- 示例:
java.util.Iterator
、java.util.Collection
- 模板方法模式(Template Method Pattern)
- 定义一个操作中的算法的骨架,将一些步骤延迟到子类中
- 示例:
java.util.AbstractList
、java.util.AbstractMap
- 解释器模式(Interpreter Pattern)
- 定义一个语言的文法,并且建立一个解释器来解释该语言中的句子
- 示例:
java.util.regex.Pattern
、javax.el.ELResolver
总结
这些设计模式提供了在特定情境中解决问题的通用方法,每种设计模式都有其适用的场景和优缺点。使用它们可以提高代码的可读性、可维护性和可扩展性。当我们对它们充分的掌握了,也可以自己去创造模式。最后,就像是倚天屠龙记中张无忌学习太极功似的,化有形于无形,无招胜有招(即所有模式变无模式)。
相关文章:

【Java 设计模式】23 种设计模式
文章目录 设计模式是什么计算机行业里的设计模式创建型模式(共 5 种)结构型模式(共 7 种)行为型模式(共 11 种) 总结 设计模式是什么 “每一个模式描述了一个在我们周围不断重复发生的问题,以及…...

ElasticSearch深度分页解决方案
一、前言 ElasticSearch是一个基于Lucene的搜索引擎,它支持复杂的全文搜索和实时数据分析。在实际应用中,我们经常需要对大量数据进行分页查询,但是传统的分页方式在处理大量数据时会遇到性能瓶颈。本文将介绍ElasticSearch分页工作原理、深…...

nginx下upstream模块详解
目录 一:介绍 二:特性介绍 一:介绍 Nginx的upstream模块用于定义后端服务器组,以及与这些服务器进行通信的方式。它是Nginx负载均衡功能的核心部分,允许将请求转发到多个后端服务器,并平衡负载。 在upst…...

基于ssm的双减后初小教育课外学习生活活动平台的设计与实现论文
双减后初小教育课外学习生活活动平台的设计与实现 摘 要 当下,正处于信息化的时代,许多行业顺应时代的变化,结合使用计算机技术向数字化、信息化建设迈进。以前学校对于课外学习活动信息的管理和控制,采用人工登记的方式保存相关…...

wblogic中间件配置数据源
配置数据源 1.服务-数据源-配置-新建 2.单机选一般数据源 3.选择源名称、jndi名称、数据库类型 4.选择驱动 5.下一步 6.输入连接串信息 参考: 格式二:jdbc:oracle:thin:<host>:<port>:<SID> 数据库名称配置的sid 7.测试配置ÿ…...

Java数据结构之装箱拆箱
装箱和拆箱 也叫装包拆包,装包是把那八种基本数据类型转换为它的包装类,拆包则相反 上面这俩种方式都是装包,下面是它的字节码文件 用到了Integer的ValueOf方法: 就是返回了一个Integer类的对象,把它的value属性设置成…...

各版本 操作系统 对 .NET Framework 与 .NET Core 支持
有两种类型的受支持版本:长期支持 (LTS) 版本和标准期限支持 (STS) 版本。 所有版本的质量都是一样的。 唯一的区别是支持的时间长短。 LTS 版本可获得为期三年的免费支持和补丁。 STS 版本可获得 18 个月的免费支持和修补程序。 有关详细信息,请参阅 .N…...
Golang 线程安全与 sync.Map
前言 线程安全通常是指在并发环境下,共享资源的访问被适当地管理,以防止竞争条件(race conditions)导致的数据不一致 Go语言中的线程安全可以通过多种方式实现 实现方式 互斥锁(Mutexes) Go的sync包提供…...

1.2 Hadoop概述
小肥柴的Hadoop之旅 1.2 Hadoop概述 目录1.2 Hadoop概述1.2.1 回归问题1.2.2 Google的三篇论文1.2.3 Hadoop的诞生过程1.2.4 Hadoop特点简介 参考文献和资料 ) 目录 1.2 Hadoop概述 1.2.1 回归问题 通过前一篇帖子的介绍,特别是问题思考部分的说明,我…...
Adams许可管理安全控制策略
随着全球信息化的快速发展,信息安全和许可管理问题日益凸显。在这场无形的挑战中,Adams许可管理安全控制策略以其卓越的性能和可靠性,引领着解决这类问题的新潮流。 Adams许可管理安全控制策略是一种全方位、多层次的安全控制方案࿰…...

无人地磅系统|内蒙古中兴首创无人地磅和远程高效管理的突破
走进标杆企业,感受名企力量,探寻学习优秀企业领先之道。 本期要跟砼行们推介的标杆企业是内蒙古赤峰市砼行业的龙头企业:赤峰中兴首创混凝土搅拌有限责任公司(以下简称为中兴首创)。 中兴首创成立于2011年初ÿ…...
【SpringCloud】7、Spring Cloud Gateway限流配置
1、限流介绍 Spring Cloud Gateway 的限流配置主要涉及到令牌桶算法的实现。令牌桶算法可以对某一时间窗口内的请求数进行限制,保持系统的可用性和稳定性,防止因流量暴增而导致的系统运行缓慢或宕机。 在 Spring Cloud Gateway 中,官方提供了 RequestRateLimiterGatewayFi…...

【gRPC学习】使用go学习gRPC
个人博客:Sekyoro的博客小屋 个人网站:Proanimer的个人网站 RPC是远程调用,而google实现了grpc比较方便地实现了远程调用,gRPC是一个现代的开源远程过程调用(RPC)框架 概念介绍 在gRPC中,客户端应用程序可以直接调用另一台计算机上的服务器应用程序上的方法&#…...

C语言中常用的字符串函数(strlen、sizeof、sscanf、sprintf、strcpy)
C语言中常用的字符串函数 文章目录 C语言中常用的字符串函数1 strlen函数2 sizeof函数2.1 sizeof介绍2.2 sizeof用法 3 sscanf函数3.1 sscanf介绍3.2 sscanf用法3.3 sscanf高级用法 4 sprintf函数4.1 背景4.2 sprintf用法 5 strcpy函数5.1 strcpy介绍5.1 strcpy用法 1 strlen函…...
域名解析服务器:连接你与互联网的桥梁
域名解析服务器:连接你与互联网的桥梁 大家好,我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天,我们将探讨一个网络世界中至关重要却鲜为人知的角…...
理论物理在天线设计和射频电路设计中的应用
理论物理的基本原理可以应用于电路中的电磁场分析和电磁波传播问题,例如天线设计和射频电路设计。通过应用麦克斯韦方程组和电磁波传播理论,可以优化电路的性能,提高天线的辐射效率和射频电路的传输效率。麦克斯韦方程组是描述电磁场行为的基…...

MySql01:初识
1.mysql数据库2.配置环境变量3. 列的类型和属性,索引,注释3.1 类型3.2 属性3.3 主键(主键索引)3.4 注释 4.结构化查询语句分类:5.列类型--表列类型设置 1.mysql数据库 数据库: 数据仓库,存储数据,以前我…...

Python——运算符
num 1 num 1 print("num1:", num) num - 1 print("num-1:", num) num * 4 print("num*4:", num) num / 4 print("num/4:", num) num 3 num % 2 print("num%2:", num) num ** 2 print("num**2:", num) 运行结果…...

赋能软件开发:生成式AI在优化编程工作流中的应用与前景
随着人工智能(AI)技术的快速发展,特别是生成式AI模型如GPT-3/4的出现,软件开发行业正经历一场变革,这些模型通过提供代码生成、自动化测试和错误检测等功能,极大地提高了开发效率和软件质量。 本文旨在深入…...

通过盲对抗性扰动实时击败基于DNN的流量分析系统
文章信息 论文题目:Defeating DNN-Based Traffic Analysis Systems in Real-Time With Blind Adversarial Perturbations 期刊(会议):30th USENIX Security Symposium 时间:2021 级别:CCF A 文章链接&…...

国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...

基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...

【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道
文/法律实务观察组 在债务重组领域,专业机构的核心价值不仅在于减轻债务数字,更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明,合法债务优化需同步实现三重平衡: 法律刚性(债…...
xmind转换为markdown
文章目录 解锁思维导图新姿势:将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件(ZIP处理)2.解析JSON数据结构3:递归转换树形结构4:Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...

JDK 17 序列化是怎么回事
如何序列化?其实很简单,就是根据每个类型,用工厂类调用。逐个完成。 没什么漂亮的代码,只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…...

qt+vs Generated File下的moc_和ui_文件丢失导致 error LNK2001
qt 5.9.7 vs2013 qt add-in 2.3.2 起因是添加一个新的控件类,直接把源文件拖进VS的项目里,然后VS卡住十秒,然后编译就报一堆 error LNK2001 一看项目的Generated Files下的moc_和ui_文件丢失了一部分,导致编译的时候找不到了。因…...
2025.6.9总结(利与弊)
凡事都有两面性。在大厂上班也不例外。今天找开发定位问题,从一个接口人不断溯源到另一个 接口人。有时候,不知道是谁的责任填。将工作内容分的很细,每个人负责其中的一小块。我清楚的意识到,自己就是个可以随时替换的螺丝钉&…...

中科院1区顶刊|IF14+:多组学MR联合单细胞时空分析,锁定心血管代谢疾病的免疫治疗新靶点
中科院1区顶刊|IF14:多组学MR联合单细胞时空分析,锁定心血管代谢疾病的免疫治疗新靶点 当下,免疫与代谢性疾病的关联研究已成为生命科学领域的前沿热点。随着研究的深入,我们愈发清晰地认识到免疫系统与代谢系统之间存在着极为复…...