JDK 中用到了哪些设计模式?

以下是整理的⼏个在 JDK 库中 常⽤的⼏个设计模式。
桥接模式

 这个模式将抽象和抽象操作的实现进⾏了解耦,这样使得抽象和实现可以 独⽴地变化。

Java 应⽤中,对于桥接模式有⼀个⾮常典型的例⼦,就是应⽤程序使⽤
JDBC 驱动程序进⾏开发的⽅式。所谓驱动程序,指的是按照预先约定好
的接⼝来操作计算机系统或者是外围设备的程序。
适配器模式

 ⽤来把⼀个接⼝转化成另⼀个接⼝。使得原本由于接⼝不兼容⽽不能⼀起 ⼯作的那些类可以在⼀起⼯作。

java.util.Arrays#asList()
java.io.InputStreamReader(InputStream)
java.io.OutputStreamWriter(OutputStream)
组合模式

 ⼜叫做部分-整体模式,使得客户端看来单个对象和对象的组合是同等的。 换句话说,某个类型的⽅法同时也接受⾃身类型作为参数。

java.util.Map#putAll(Map)
java.util.List#addAll(Collection)
java.util.Set#addAll(Collection)
装饰者模式
动态的给⼀个对象附加额外的功能,这也是⼦类的⼀种替代⽅式。可以看 到,在创建⼀个类型的时候,同时也传⼊同⼀类型的对象。这在 JDK ⾥随 处可⻅,你会发现它⽆处不在,所以下⾯这个列表只是⼀⼩部分。
java.io.BufferedInputStream(InputStream)
java.io.DataInputStream(InputStream)
java.io.BufferedOutputStream(OutputStream)
java.util.zip.ZipOutputStream(OutputStream)
java.util.Collections#checkedList|Map|Set|SortedSet|Sort
edMap
享元模式

 使⽤缓存来加速⼤量⼩对象的访问时间。

java.lang.Inteer#valueOf(in
java.lang.Boolean#value
java.lang.Integer#valueOf(int)   -127-128
java.lang.Boolean#valueOf(boolean)
java.lang.Byte#valueOf(byte)
java.lang.Character#valueOf(char)
f(boolean)

 代理模式

 代理模式是⽤⼀个简单的对象来代替⼀个复杂的或者创建耗时的对象。

java.lang.reflect.Proxy
RMI

 抽象⼯⼚模式

 

抽象⼯⼚模式提供了⼀个协议来⽣成⼀系列的相关或者独⽴的对象,⽽不 ⽤指定具体对象的类型。它使得应⽤程序能够和使⽤的框架的具体实现进 ⾏解耦。这在 JDK 或者许多框架⽐如 Spring 中都随处可⻅。它们也很容 易识别,⼀个创建新对象的⽅法,返回的却是接⼝或者抽象类的,就是抽 象⼯⼚模式了。
java.util.Calendar#getInstance()
java.util.Arrays#asList()
java.util.ResourceBundle#getBundle()
java.sql.DriverManager#getConnection()
java.sql.Connection#createStatement()
java.sql.Statement#executeQuery()
java.text.NumberFormat#getInstance()
javax.xml.transform.TransformerFactory#newInstance()
建造者模式
定义了⼀个新的类来构建另⼀个类的实例,以简化复杂对象的创建。建造 模式通常也使⽤⽅法链接来实现。
java.lang.StringBuilder#append()
java.lang.StringBuffer#append()
java.sql.PreparedStatement
javax.swing.GroupLayout.Group#addComponent()
⼯⼚⽅法

 就是⼀个返回具体对象的⽅法。

java.lang.Proxy#newProxyInstance()
java.lang.Object#toString()
java.lang.Class#newInstance()
java.lang.reflect.Array#newInstance()
java.lang.reflect.Constructor#newInstance()
java.lang.Boolean#valueOf(String)
java.lang.Class#forName()
原型模式
使得类的实例能够⽣成⾃身的拷⻉。如果创建⼀个对象的实例⾮常复杂且 耗时时,就可以使⽤这种模式,⽽不重新创建⼀个新的实例,你可以拷⻉ ⼀个对象并直接修改它。

 

java.lang.Object#clone()
java.lang.Cloneable
单例模式
⽤来确保类只有⼀个实例。 Joshua Bloch Effetive Java 中建议到,还有 ⼀种⽅法就是使⽤枚举。

 

java.lang.Runtime#getRuntime()
java.awt.Toolkit#getDefaultToolkit()
java.awt.GraphicsEnvironment#getLocalGraphicsEnvironment
()
java.awt.Desktop#getDesktop()

 

 责任链模式

通过把请求从⼀个对象传递到链条中下⼀个对象的⽅式,直到请求被处理
完毕,以实现对象间的解耦

 

java.util.logging.Logger#log()
javax.servlet.Filter#doFilter()
命令模式

 将操作封装到对象内,以便存储,传递和返回。

java.lang.Runnable
javax.swing.Action
解释器模式

 这个模式通常定义了⼀个语⾔的语法,然后解析相应语法的语句

java.util.Pattern
java.text.Normalizer
java.text.Format
迭代器模式

 提供⼀个⼀致的⽅法来顺序访问集合中的对象,这个⽅法与底层的集合的 具体实现⽆关。

 

java.util.Iterator
java.util.Enumeration
中介者模式

 通过使⽤⼀个中间对象来进⾏消息分发以及减少类之间的直接依赖。

java.util.Timer
java.util.concurrent.Executor#execute()
java.util.concurrent.ExecutorService#submit()
java.lang.reflect.Method#invoke()
备忘录模式
⽣成对象状态的⼀个快照,以便对象可以恢复原始状态⽽不⽤暴露⾃身的
内容。 Date 对象通过⾃身内部的⼀个 long 值来实现备忘录模式。

 

java.util.Date
java.io.Serializable
观察者模式

 它使得⼀个对象可以灵活的将消息发送给感兴趣的对象。

java.util.EventListener
javax.servlet.http.HttpSessionBindingListener
javax.servlet.http.HttpSessionAttributeListener
javax.faces.event.PhaseListener

 策略模式

使⽤这个模式来将⼀组算法封装成⼀系列对象。通过传递这些对象可以灵
活的改变程序的功能。
java.util.Comparator#compare()
javax.servlet.http.HttpServlet
javax.servlet.Filter#doFilter()

 模板⽅法模式

让⼦类可以重写⽅法的⼀部分,⽽不是整个重写,你可以控制⼦类需要重 写那些操作。

 

java.util.Collections#sort()
java.io.InputStream#skip()
java.io.InputStream#read()
java.util.AbstractList#indexOf()
访问者模式
提供⼀个⽅便的可维护的⽅式来操作⼀组对象。它使得你在不改变操作的 对象前提下,可以修改或者扩展对象的⾏为。
javax.lang.model.element.Element and
javax.lang.model.element.ElementVisitor
javax.lang.model.type.TypeMirror and
javax.lang.model.type.TypeVisitor

状态模式 

通过改变对象内部的状态,使得你可以在运⾏时动态改变⼀个对象的⾏ 为

 

java.util.Iterator
javax.faces.lifecycle.LifeCycle#execute()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/4664.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Node.js 中的线程 与 并发

Node.jsNode.js 中的线程 与并发jcLee95 :https://blog.csdn.net/qq_28550263?spm1001.2101.3001.5343 邮箱 :291148484163.com 本文地址:https://blog.csdn.net/qq_28550263/article/details/129784985 目 录1. JavaScript 与线程1.1 Java…

8种特“坑”的 SQL 写法,性能降低100倍

给大家分享几个SQL常见的“坏毛病”及优化技巧。 SQL语句的执行顺序: 1、LIMIT 语句 分页查询是最常用的场景之一,但也通常也是最容易出问题的地方。比如对于下面简单的语句,一般 DBA 想到的办法是在 type、 name、 create_time 字段上加组…

春分-面试

青岛 zc: 1.String的类型 string、stringbuilder 、stringbuffer? String不可变、另外两个可变、StringBuilder线程不安全、但是效率高、并且String不能被继承。 JVM是C写的编译后的机器码, 2.集合类的用法,还问了键值对。key如果…

06solr 文件删除

文章目录 0x01 漏洞介绍0x02 影响版本0x03 漏洞环境0x04 漏洞复现0x05 修复建议摘抄免责声明0x01 漏洞介绍 Apache Solr 存在任意文件删除漏洞,在目前的最新版本(8.8.2)中仍然未被修复,漏洞的根本成因是函数 **Files.deleteIfExists()**对要删除的文件名并未做校验。同时 Apa…

小程序面试题(day07)

文章目录前言微信小程序自定义tabbar的理解?微信小程序怎么缓存数据?微信小程序怎么进行网络请求?微信小程序路由跳转以及传参如何实现?微信小程序生命周期的理解?微信小程序模块化?微信小程序所有api放在哪…

高并发系统设计:缓存、降级、限流、(熔断)

高并发系统设计:缓存、降级、限流、(熔断) 在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流。 非核心服务可以采用降级、熔断,核心服务采用缓存和限流(隔离流量可以最大限度的保障业务无损)。 缓存 缓…

Scala隐式转换

Scala 的隐式转换是一种自动类型转换机制,它可以在编译器自动插入一些代码,将一个类型自动转换成另一个类型。这种转换可以发生在函数调用、赋值、类型转换等多种场景中。 隐式转换的机制可以让 Scala 代码更加简洁、优雅。例如,我们可以通过…

“体育游戏第一股”投资未来,望尘科技走向价值兑现周期

2022年的游戏市场,遗憾以疲弱之势落下帷幕。游戏市场规模与用户数量,均出现了小幅下降,显示出存量市场的典型特征。 但与此同时,更多垂直领域的拳头产品、响应市场需求的精品游戏,却屡屡掀起热潮。去年随世界杯而来的…

Darknet-YOLOv4训练步骤

1、打开终端,克隆项目 git clone https://github.com/AlexeyAB/darknet.git2、修改Makefile文件 其中,GPU和CUDNN是GPU加速,CUDNN_HALF是特定硬件加速,OPENCV是否使用OpenCV,AVX和OPENMP是CPU加速opencv编译问题htt…

JavaScript常用知识点

1-包装数据类型 一个基本数据类型当你使用的时候会自动转换成复杂数据类型,当你使用完毕,会自动转换为基本数据类型 比如 字符串 string是基本数据类型,但是它可以使用 length这个方法 ,就是因为字符串也是一个包装数据类型&…

Spring整合

Spring整合6,Spring整合6.1 Spring整合Mybatis思路分析6.1.1 环境准备步骤1:准备数据库表步骤2:创建项目导入jar包步骤3:根据表创建模型类步骤4:创建Dao接口步骤5:创建Service接口和实现类步骤6:添加jdbc.properties文件步骤7:添加Mybatis核心配置文件步骤8:编写应用…

Canny 边缘检测算法-python实现(附代码)

文章目录1、调用opencv进行canny边缘检测2、图像灰度化3、高斯模糊处理4、图像梯度、梯度幅值、梯度方向计算5、NMS(非极大值抑制)6、双阈值的边界选取摘要 : Canny 边缘检测算法由计算机科学家 John F. Canny 于 1986 年提出的。其不仅提供了算法&#…

【Python】更精美的俄罗斯方块开发指南(步骤已写)

文章目录前言一、游戏介绍二、源码剖析1.引入库2.读入数据总结前言 最近想找一些Python相关的游戏开发例子,正好在itch.io上闲逛看到这个俄罗斯方块项目,瞬间被惊艳到了。作者是 Mikhail ,项目(tetris_for_two)地址是: https://g…

数据库原理及应用(四)——SQL语句(2)SQL基础查询以及常见运算符

一、SELECT语句基础 数据库查询是数据库的核心操作&#xff0c;SELECT 语句用于从数据库中选取数据。 SELECT [ALL/DISTINCT] <列名>,<列名>...FROM <表名或视图名>,<表名或视图名>[WHERE <条件表达式>][GROUP BY <列名1> [HAVING <条…

Jetpack compose:炫酷的按钮点击效果

Jetpack compose&#xff1a;炫酷的按钮点击效果 屏幕的每个组件在与用户交互时都有其给用户反馈的方式。例如&#xff0c;当用户触摸 Toggle 按钮时&#xff0c;它会更改其状态以响应交互。这种交互给用户一种感觉。 在此博客中&#xff0c;我们将实现一些自定义点击效果&…

Air700E开发板|移芯EC618|4G Cat.1模组:概述及PinOut

文章目录基础资料概述主要功能外设分布PinOut&#xff08;管脚定义&#xff09;管脚功能说明固件升级正常开机模式&#xff1a;下载模式&#xff1a;IO 电平选择基础资料 Air700E文档中心 概述 EVB-Air700E 开发板是合宙通信推出的基于 Air700E 模组所开发的&#xff0c;包含…

AI遮天传 NLP-词表示

本文重点在第三部分“词嵌入”及对Word2vec的介绍&#xff0c;前面的知识主要用于小白对词表示和一些定义、名称的理解&#xff0c;和对一些方法不足的思考。一、词表示1.1 词表示的定义词表示是一种将自然语言中的词转换为机器可理解含义的过程其中意思&#xff08;meaning&am…

Docker之安装Docker

安装Docker1. Docker 基本组成2. 安装Docker3. 阿里云镜像加速4. 底层原理1. Docker 基本组成 镜像&#xff08;image&#xff09; docker 镜像就好比是一个模板&#xff0c;可以同通过这个模板来创建容器服务&#xff0c;如&#xff1a;tomcat 镜像 > run > tomcat1 容器…

网络技术这十个术语你知道吗?

你好&#xff0c;这里是网络技术联盟站。 网络技术术语是指在计算机网络领域中所使用的专业术语。由于计算机技术的快速发展&#xff0c;网络技术术语也在不断地更新和发展。本文将对网络技术术语进行一些介绍和解释&#xff0c;以帮助读者更好地了解和掌握网络技术。 一、协…

内网Nexus代理yum、epel 源私有仓库 + 内网设备配置(centos)

一、准备 一些常用的镜像开源站 yum: 阿里开源镜像源&#xff1a;http://mirrors.aliyun.com/centos 网易开源镜像站&#xff1a;http://mirrors.163.com/ Centos社区镜像站&#xff1a;http://mirror.centos.org/centos/ 中科大开源镜像站&#xff1a;http://centos.ustc.edu…
最新文章