【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 文章链接&…...

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...
【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权
摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题:安全。文章将详细阐述认证(Authentication) 与授权(Authorization的核心概念,对比传统 Session-Cookie 与现代 JWT(JS…...

C# winform教程(二)----checkbox
一、作用 提供一个用户选择或者不选的状态,这是一个可以多选的控件。 二、属性 其实功能大差不差,除了特殊的几个外,与button基本相同,所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...
用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法
用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法 大家好,我是Echo_Wish。最近刷短视频、看直播,有没有发现,越来越多的应用都开始“懂你”了——它们能感知你的情绪,推荐更合适的内容,甚至帮客服识别用户情绪,提升服务体验。这背后,神经网络在悄悄发力,撑起…...
「Java基本语法」变量的使用
变量定义 变量是程序中存储数据的容器,用于保存可变的数据值。在Java中,变量必须先声明后使用,声明时需指定变量的数据类型和变量名。 语法 数据类型 变量名 [ 初始值]; 示例:声明与初始化 public class VariableDemo {publi…...