当前位置: 首页 > news >正文

Java 23种设计模式分类概括以及应用介绍

话不多说进入正题~

创建型模式:5种

单例模式(Singleton Pattern)
确保一个类只有一个实例,并提供全局访问点,它的主要目的是限制类的实例化并确保所有代码都共享相同的实例。

应用:Runtime类、数据库连接池、Spring Bean的单例模式,日志工具比如SLF4J,它们都只有一个全局对象

工厂模式(Factory Pattern)
将对象的实例化过程封装在一个工厂类中。通过使用工厂方法,可以根据需要创建不同类型的对象,而无需暴露具体的实例化逻辑

应用:Spring框架中的BeanFactory和ApplicationContex。它们负责创建和管理对象的实例,并将对象的创建逻辑封装在工厂类中,客户端通过工厂类获取所需的对象实例。

抽象工厂模式(Abstract Factory Pattern)
抽象工厂模式提供了一种方式来创建一系列相关对象的接口,而无需指定具体的类

应用:JDBC API中的Connection接口和DriverManager类。Connection接口代表数据库连接对象的抽象,而DriverManager类充当了抽象工厂,负责创建特定数据库厂商的连接对象(比如Oracle、MySQL)

建造者模式(Builder Pattern)
用于创建复杂对象,通过将对象的构建过程分解为多个步骤,使得同样的构建过程可以创建不同的表示

应用:StringBuilder和StringBuffer类,它们通过提供一系列方法来动态构建字符串对象,允许按照特定的顺序添加、修改和组装字符串

原型模式(Prototype Pattern)
创建对象的克隆,通过复制现有对象的属性来创建新的对象,而无需通过实例化来创建。它能够提供一种更高效、更灵活的对象创建方式

应用:Java的Cloneable接口 ,实现它就具备了原型模式的能力,clone()方法会创建并返回一个新的对象副本,该副本拥有与原始对象相同的属性值。

结构型模式(Structural Patterns): 7种

适配器模式(Adapter Pattern)
(适配器类) 将一个类的接口转换成客户端所期望的另一个接口,使得原本由于接口不兼容而无法一起工作的类可以协同工作

应用:Java集合之间的转换、IO流,比如InputStreamReader(将字节流转为字符流)

桥接模式(Bridge Pattern)
将抽象部分与实现部分分离,使它们可以独立地变化

应用:JDBC,抽象部分表示数据库连接的抽象接口,实现部分表示不同数据库的具体实现,而桥接接口充当连接抽象和实现的桥梁

组合模式(Composite Pattern)
通过使用相同的接口来处理单个对象和组合对象,组合模式使得客户端可以一致地对待它们

应用:Swing框架中的组件,各种UI组件(如按钮、文本框等)都可以作为单个对象,也可以组合

装饰器模式(Decorator Pattern)
在不改变现有对象结构的情况下,动态地将新功能附加到对象上

应用:IO流的设计

外观模式(Facade Pattern)
为复杂子系统提供一个简化的接口,以便客户端能够更轻松地使用该系统

应用:URL类,提供了一个简单的接口来处理URL的各种操作,隐藏了底层复杂的网络通信细节

享元模式(Flyweight Pattern)
通过共享对象来最大程度地减少内存使用和提高性能,通过创建一个工厂类来管理共享对象,并在需要时返回已存在的对象或创建新对象

应用:字符串常量池

代理模式(Proxy Pattern)
通过创建一个代理对象,控制对原始对象的访问。可以在访问原始对象之前或之后添加额外的逻辑,从而实现对原始对象的控制和扩展

应用:Java动态代理。在运行时动态地创建代理对象,通过代理对象来间接访问原始对象的方法和属性

行为型模式: 11种

责任链模式(Chain of Responsibility Pattern)
将请求发送者和接收者解耦,通过将多个对象组成一条责任链,依次处理请求,直到有一个对象能够处理它为止

应用:Servlet中的过滤器(Filter)、 Spring框架中的拦截器(Interceptor)

命令模式(Command Pattern)
将请求封装成一个对象,使得可以用不同的请求对客户端进行参数化。

应用: 线程池(ThreadPoolExecutor) 每个任务被封装为一个命令对象,线程池通过条件来调度。RabbitMQ每个消息被封装为一个命令对象

解释器模式(Interpreter Pattern)
该模式用于解释语言的语法或表达式,它定义了一个表达式接口,通过解释器来解释并执行特定的语法规则

应用:Java正则表达式、 XPath解析器、EL表达式

迭代器模式(Iterator Pattern)
提供了一种顺序访问聚合对象中各个元素的方法,而无需暴露聚合对象的内部表示

应用:Java集合框架的迭代器,IO流(readLine()方法)、ResultSet对象的next()方法

中介者模式(Mediator Pattern)
通过一个中介者对象来封装一系列对象之间的交互,使得对象之间不需要显式地相互引用,从而降低了耦合度

应用:JVM垃圾回收器、ApplicationContext:负责组件之间的通信和协调

备忘录模式(Memento Pattern)
保存对象的内部状态,并在需要时恢复到之前的状态,提供了一种捕获和恢复对象状态的机制

应用:Java事务管理(JTA)

观察者模式(Observer Pattern)
定义了一种一对多的依赖关系,使得多个观察者对象可以同时监听一个主题对象,当主题对象发生变化时,会通知所有观察者对象进行更新

应用:Java事件模型(EventObject)中的事件和监听器, Java消息服务(JMS)中消息的发布和订阅机制

状态模式(State Pattern)
允许对象在内部状态改变时改变它的行为,使得对象在不同状态下可以有不同的行为

应用:Java线程生命周期(Thread Lifecycle)、Java网络编程中的套接字(Socket)、JVM中的垃圾回收器(Garbage Collector)、Spring中的Bean生命周期

策略模式(Strategy Pattern)
该模式定义了一系列算法,并将每个算法封装到可互换的策略对象中,使得算法可以独立于使用它的客户端进行变化

应用:Java集合框架的比较器(Comparator)、Spring的事务管理器(TransactionManager)、Java线程调度器

模板方法模式(Template Method Pattern)
将算法的通用部分放在抽象类中,并将具体的实现细节延迟到子类中,以实现代码的复用和灵活性

应用: IO流设计、HttpServlet(doGet()、doPost()方法被子类重写)、Spring的JdbcTemplate

访问者模式(Visitor Pattern)
将数据结构与数据操作分离,使得可以在不改变数据结构的情况下定义新的操作

应用:Spring中的AOP功能式允许切面在目标对象的不同方法上执行特定的操作

相关文章:

Java 23种设计模式分类概括以及应用介绍

话不多说进入正题~ 创建型模式:5种 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供全局访问点,它的主要目的是限制类的实例化并确保所有代码都共享相同的实例。 – 应用:Runtime类、数据库连…...

运筹优化算法常用求解器汇总

运筹学从形成到发展,在此过程中积累的大量理论和方法在国防、能源、制造、交通、金融、通信等各个领域发挥着越来越重要的作用。我们在生产生活中遇到的很多实际问题,都可以通过运筹学所涉及的优化方法对其进行数学建模,表示为数学问题&#…...

字符串函数(一)

✨博客主页:小钱编程成长记 🎈博客专栏:进阶C语言 字符串函数(一) 0.前言1.求字符串长度的函数1.1 strlen(字符串长度) 2.长度不受限制的字符串函数2.1 strcpy(字符串拷贝&#xff0…...

Ubuntu 安装 Docker 的详细步骤

文章目录 简介1.更新2.安装必要的软件包2.1 基于阿里源 3.验证 Docker 安装是否成功4.安装后的一些常规设置及常用的命令4.1 启动 Docker4.2 Docker 在系统启动时自动运行4.3 运行一个 Hello World 镜像4.4 查看docker运行状态 欢迎来到这篇关于在 Ubuntu 上安装 Docker 的教程…...

使用Python进行App用户细分

App用户细分是根据用户与App的互动方式对用户进行分组的任务。它有助于找到保留用户,找到营销活动的用户群,并解决许多其他需要基于相似特征搜索用户的业务问题。这篇文章中,将带你完成使用Python进行机器学习的App用户细分任务。 App用户细…...

博弈论——伯特兰德寡头模型(Bertrand Model)

伯特兰德寡头模型(Bertrand Model) 0 引言 在前面几篇文章中,我们介绍了古诺模型(Cournot duopoly model)和斯塔克尔伯格模型(Stackelberg model) 博弈论——连续产量古诺模型(Cournot duopoly model) 博弈论——斯塔克尔伯格模型(Stackelberg model) 这两个模型…...

第一百六十回 SliverPadding组件

文章目录 概念介绍使用方法示例代码 我们在上一章回中介绍了SliverAppBar组件相关的内容,本章回中将介绍 SliverPadding组件.闲话休提,让我们一起Talk Flutter吧。 概念介绍 我们在本章回中介绍的SliverPadding组件类似Pading组件,它主要用…...

Mapfree智驾方案,怎样实现成本可控?

整理|睿思 编辑|祥威 编者注:本文是HiEV出品的系列直播「智驾地图之变」第二期问答环节内容整理。 元戎启行副总裁刘轩与连线嘉宾奥维咨询董事合伙人张君毅、北汽研究总院智能网联中心专业总师林大洋、主持嘉宾周琳展开深度交流,并进行了答疑。 本期元…...

javascript: Bubble Sort

// Sorting Algorithms int JavaScript /** * file Sort.js * 1. Bubble Sort冒泡排序法 */ function BubbleSort(arry, nszie) {var i, j, temp;var swapped;for (i 0; i < nszie - 1; i){swapped false;for (j 0; j < nszie - i - 1; j){if (arry[j] > arry[j …...

DM数据库根据rowid删除重复的记录

oracle中rowid的用法-CSDN博客 delete from stu a where rowid not in (select max(b.rowid) from stu b where a.nob.no and a.name b.name and a.sex b.sex); //这里max使用min也可以...

【AI视野·今日Robot 机器人论文速览 第四十期】Mon, 25 Sep 2023

AI视野今日CS.Robotics 机器人学论文速览 Mon, 25 Sep 2023 Totally 36 papers &#x1f449;上期速览✈更多精彩请移步主页 Interesting: &#x1f4da;CloudGripper, 一套云化的机器抓取人数据采集系统&#xff0c;包含了32个机械臂的集群。(from KTH Royal Institute of Te…...

HashMap底层源码,数据结构

HashMap的底层结构在jdk1.7中由数组链表实现&#xff0c;在jdk1.8中由数组链表红黑树实现&#xff0c;以数组链表的结构为例。 JDK1.8之前Put方法&#xff1a; JDK1.8之后Put方法&#xff1a; HashMap基于哈希表的Map接口实现&#xff0c;是以key-value存储形式存在&#xff0c…...

计算机等级考试—信息安全三级真题八

一、单选题...

番外6:下载+安装+配置Linux

#########配置Linux---后续 step08: 点击编辑虚拟机设置&#xff0c;选择下载好的映像文件.iso进行挂载&#xff1b; step09: 点击编辑虚拟机选项&#xff0c;选择UEFI启动模式并点击确定&#xff1b; step10: 点击开启虚拟机&#xff0c;选择Install rhel &#xff1b; 备注&…...

javascript验证表单字段有效性,使用checkValidity()方法和他的属性

<script type"text/javascript">function LoginCheckValidity(){var txt"";var rmb1document.getElementById("rmb1");if(rmb1.checkValidity()false){if(rmb1.validitionMessageundefined){txt"输入金额有误,金额10-200之间";}…...

pdf怎么调整大小kb?pdf文件过大这样压缩

在日常的工作和生活中&#xff0c;我们常常会遇到需要调整PDF文件大小的问题。有时候&#xff0c;我们需要将大型的PDF文件上传到某些平台&#xff0c;但平台的限制让我们不得不压缩文件的大小。那么&#xff0c;如何有效地调整PDF文件的大小呢&#xff1f; 一、使用嗨格式压缩…...

vue3中的watch

在Vue3中&#xff0c;watch中的参数可以分为两部分&#xff0c;即要监听的响应式数据以及回调函数。 语法格式如下&#xff1a; watch(要监听的响应式数据, 回调函数)除了以上的两个还有其他的参数 immediate&#xff1a;是否在初始化时立即执行一次回调函数&#xff0c;默认…...

开绕组电机零序Bakc EMF-based无感控制以及正交锁相环inverse Park-based

前言 最近看论文遇到了基于反Park变换的锁相环&#xff0c;用于从开绕组永磁同步电机零序电压信号中提取转子速度与位置信息&#xff0c;实现无感控制。在此记录 基于零序Back EMF的转子估算 开绕组电机的零序反电动势 e 0 − 3 ω e ψ 0 s i n 3 θ e e_0-3\omega_e\psi_…...

番外5:下载+安装+配置Linux

任务前期工作&#xff1a; 01. 电脑已安装好VMware Workstation软件&#xff1b; 02.提前下载好Rhel-8.iso映像文件&#xff08;文件较大一般在9.4GB&#xff0c;建议采用迅雷下载&#xff09;&#xff0c;本人使用的以下版本&#xff08;地址ed2k://|file|rhel-8.4-x86_64-dvd…...

新手--安装好Quartus II13.0(带modelsim集成包)并用Quartus II搭建一个工程

前言 今天是国庆节&#xff0c;我们正式来学习Quartus II13.0软件的安装与使用。学习verilog与学习C语言都是学习一门语言&#xff0c;那么学习一门语言&#xff0c;光看理论不敲代码绝对是学习不好的。要用verilog语言敲代码&#xff0c;就要像C语言那样搭建起语言的编译环境&…...

python监控软件内存、cpu和GDI

目录 前言代码 前言 最近做软件测试需要监控软件内存、cpu和GDI对象数&#xff0c;用psutil库可以很方便的实现监控内存和CPU&#xff0c;但是GDI好像还不行&#xff0c;最后来的win32api来调用的Windows API接口来实现GDI监控的&#xff0c;在此做个记录。 代码 import psu…...

wordpress搭建自己的博客详细过程以及踩坑

WordPress作为一款开源的内容管理系统&#xff08;CMS&#xff09;&#xff0c;具有诸多优势。首先&#xff0c;它的易用性使得即使对于没有编程经验的用户来说也能轻松上手&#xff0c;通过直观的用户界面和友好的管理工具&#xff0c;用户可以方便地创建、编辑和发布内容。其…...

在jupyter中更改、增加内核

今天在配置llama2的环境&#xff0c;在学院实验室的服务器上面用jupyter&#xff0c;怎么都不会增加内核。今天说一下怎么把创建好的conda环境增加到jupyter列表中。 例如我有个环境叫做llama2&#xff0c;很简单只要两步。 第一步先激活conda环境。 conda activate llama2第…...

Redis代码实践总结(二)

使用 CLI 探索 Redis 外部程序使用 TCP 套接字和 Redis 特定协议与 Redis 进行通信。该协议在不同编程语言的 Redis 客户端库中实现。然而&#xff0c;为了使使用 Redis 进行黑客攻击变得更简单&#xff0c;Redis 提供了一个命令行实用程序&#xff0c;可用于向 Redis 发送命令…...

读取一张图片各种颜色占比

提问之初 <small> 读取一张图片各种颜色占比 /storage/emulated/0/Pictures/Screenshots/Screenshot_20230725_195440.jpg有趣优雅热情沉着的代码与注释/每行每行 from PIL import Image # 导入PIL大法&#xff0c;这是处理图像的必备神器# 图片路径&#xff0c;此处为…...

C程序设计内容与例题讲解 -- 第四章--选择结构程序设计(第五版)谭浩强

前言&#xff1a;在第三章我们介绍了顺序结构程序设计。在顺序结构中&#xff0c;各个语句是按自上而下的顺序执行的&#xff0c;执行完上一个语句就自动执行下一个语句&#xff0c;是无条件的&#xff0c;不必做任何判断。是这最简单的程序结构。实际上&#xff0c;在很多情况…...

Blued引流脚本

于多数人来说&#xff0c;引流都是一个比较困难的操作&#xff0c;因为流量不会听你的。所以任何人在网上做生意&#xff0c;或者开一个实体店&#xff0c;都会为流量而发愁&#xff0c;其实对于流量的吸引来说&#xff0c;我们越是刻意为之&#xff0c;可能所获得的效果也越不…...

数据结构之美:如何优化搜索和排序算法

文章目录 搜索算法的优化1. 二分搜索2. 哈希表 排序算法的优化1. 快速排序2. 归并排序 总结 &#x1f389;欢迎来到数据结构学习专栏~数据结构之美&#xff1a;如何优化搜索和排序算法 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客&#x…...

Unity 鼠标悬浮时文本滚动(Text Mesh Pro)

效果 直接将脚本挂载在Text Mesh Pro上&#xff0c;但是需要滚动的文本必须在Scroll View中&#xff0c;否侧会定位错误&#xff0c;还需要给Scroll View中看需求添加垂直或者水平布局的组件 代码 using System.Collections; using System.Collections.Generic; using UnityE…...

GNN PyG~torch_geometric 学习理解

目录 1. PyG Introduction 2. PyG Installation 2.1 PyG 安装常见错误及原因 2.2 PyG 具体安装步骤 3. torch_geometric packages torch_geometric.data.Data Dataset 与 DataLoader Dropout、BatchNorm 3. torch_geometric: 理解edge_index 3.1 理解 mini-batch edg…...

wordpress 关闭插件/微博推广有用吗

生成验证码,具体实现代码如下&#xff1a; //添加header头 header("Content-type:image/jpeg"); set_time_limit(0); $size 20; //添加字体样式 具体字体样式在这个目录下&#xff1a;c:/windows/fonts $font "simheittf.ttf"; //创建画布 $im imagecr…...

如皋网站开发/网站一般需要怎么推广

方法一&#xff1a; 开发者选项里面把 Pointer location打开后&#xff0c;就可以直接在ui界面的上方看到坐标值。 方法二&#xff1a; 通过使用adb shell getevent&#xff0c;可以得到如下设备操作后的指令&#xff0c;具体表示的含义&#xff0c;可以参考网上很多的文章&…...

wordpress创建文档系统/国内新闻最近新闻今天

一、卸载掉原有mysql [rootxiaoluo ~]# rpm -qa | grep mysql  // 这个命令就会查看该操作系统上是否已经安装了mysql数据库 [rootxiaoluo ~]# rpm -e mysql  // 普通删除模式 [rootxiaoluo ~]# rpm -e --nodeps mysql  // 强力删除模式&#xff0c;如果使用上面命令删除…...

wordpress安卓ios应用/seo店铺描述例子

“笑来老师的课讲得好&#xff0c;但是如果听完课还买笑来老师的币&#xff0c;那说明你没学到家。”一名资深韭菜评价道。文 | 昕楠 运营 | 盖遥出品 | Odaily星球日报&#xff08;ID&#xff1a;o-daily&#xff09;牛市让不少退圈大佬“回归”。李笑来便是其一。一年前的 7…...

wordpress 代码质量/培训体系包括四大体系

一、业务需求&#xff1a; 将几百张excel表的业务数据抽取到mysql数据库中 二、系统环境 kettle8.3 mysql5.7.29 三、遇到的问题 excel表的中文抽取到mysql数据库&#xff0c;显示乱码...

怎么做网站内容添加/搜索引擎优化的核心是

代码和按钮要使用的代码如下&#xff1a;欢迎登录成绩查询系统学号&#xff1a;...代码和按钮要使用的代码如下&#xff1a;欢迎登录成绩查询系统学号&#xff1a;密码&#xff1a;按钮需要的代码&#xff1a;String driverName "com.microsoft.sqlserver.jdbc.SQLServer…...