【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 文章链接&…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
