文末送书!谈谈原型模式在JAVA实战开发中的应用(附源码+面试题)
作者主页:Designer 小郑
作者简介:3年JAVA全栈开发经验,专注JAVA技术、系统定制、远程指导,致力于企业数字化转型,CSDN博客专家,蓝桥云课认证讲师。
本文讲解了 Java 设计模式中的原型模式,并给出了样例代码,原型模式的主要目的是通过复制或克隆现有对象来创建新对象,而无需依赖于显式的实例化过程。

目录
- 一、谈谈什么是对象克隆?
- 二、谈谈什么是深拷贝和浅拷贝,有什么区别?
- 2.1 深拷贝
- 2.2 浅拷贝
- 2.3 小节
- 三、如何解决java对象拷贝的性能问题
- 四、学习什么是原型模式
- 五、原型模式上手实战
- 六、原型模式的应用场景
- 七、原型模式面试题
- 八、文末福利
一、谈谈什么是对象克隆?
在学习原型模式之前,首先要理解对象克隆的概念。
在Java中, 对象克隆是指创建一个现有对象的副本 \color{red}{对象克隆是指创建一个现有对象的副本} 对象克隆是指创建一个现有对象的副本,对象克隆通常用于在不影响原始对象的情况下创建一个相同状态的新对象。
Java中的对象克隆可以通过实现 Cloneable 接口和重写 clone() 方法来实现。
在使用克隆时,可以使用clone()方法创建对象的副本,该方法返回一个新的对象,该对象具有与原始对象相同的属性值。
Java 中的 clone() 方法执行的是浅拷贝,这意味着克隆的对象和原始对象共享相同的引用类型字段,如果需要实现深拷贝,即克隆对象及其所有引用类型字段的副本,就需要在 clone() 方法中进行相应的处理。

二、谈谈什么是深拷贝和浅拷贝,有什么区别?
在Java中, 对象拷贝可以分为浅拷贝和深拷贝两种方式 \color{red}{对象拷贝可以分为浅拷贝和深拷贝两种方式} 对象拷贝可以分为浅拷贝和深拷贝两种方式,它们之间的区别在于拷贝对象时是否创建了原始对象的副本,以及对引用类型字段的处理方式。
2.1 深拷贝
深拷贝是指创建一个新对象,该对象的字段值与原始对象完全相同,包括引用类型字段。在深拷贝中,不仅复制了对象的基本类型字段,还创建了新的对象来存储引用类型字段的副本。这意味着修改拷贝对象的引用类型字段不会影响原始对象的引用类型字段,因为它们引用的是不同的对象。
2.2 浅拷贝
浅拷贝是指创建一个新对象,该对象的字段值与原始对象完全相同,但对于引用类型字段,它们共享相同的引用。换句话说,浅拷贝只复制了对象中的基本类型字段,而对于引用类型字段,只是复制了引用,没有创建新的对象。
在浅拷贝中,修改拷贝对象的引用类型字段会影响到原始对象的引用类型字段。这是因为原始对象和拷贝对象共享相同的引用,所以它们指向相同的内存地址。
2.3 小节
实现深拷贝的方式有多种,比较常用的方法包括以下 3 3 3 点。
- 通过实现
Serializable接口,使用对象的序列化和反序列化来实现深拷贝。 - 使用
Cloneable接口和重写clone()方法来实现深拷贝。 - 在
clone()方法中,除了调用super.clone()复制对象的基本类型字段外,还需要对引用类型字段进行单独的深拷贝处理。
总结起来,浅拷贝只复制对象的基本类型字段和引用类型字段的引用,而深拷贝会复制对象的基本类型字段和引用类型字段的副本。
因此,在需要保留对象独立性和避免原始对象修改的情况下,使用深拷贝是更为合适的选择。

三、如何解决java对象拷贝的性能问题
在Java中,对象拷贝可能面临性能问题,特别是在处理大型对象或复杂对象图时,以下是一些可以帮助解决 Java 对象拷贝性能问题的方法,给同学们提供参考。
-
使用原型模式:通过复制或克隆现有对象来创建新对象,而无需依赖于显式的实例化过程,从而避免了直接创建新对象的开销,原型模式可以通过实现
Cloneable接口和重写clone()方法来实现。 -
使用浅拷贝:如果你只需要复制对象的基本类型字段,并且可以共享引用类型字段,那么浅拷贝是一个更高效的选择,浅拷贝只涉及字段的复制,因此比深拷贝更快。
-
使用构造函数:手动编写一个构造函数,以根据原始对象的属性创建新对象,这种方式可以避免调用
clone()方法或实现Cloneable接口的开销。 -
使用序列化和反序列化:使用 Java 对象的序列化和反序列化机制可以实现深拷贝,通过将对象序列化为字节流,然后反序列化成新的对象,可以创建对象及其所有引用字段的完全独立副本,但序列化和反序列化也会带来一定的性能开销。
-
使用第三方库:有些第三方库提供了更高效的对象拷贝实现,例如
Apache Commons库提供了SerializationUtils.clone()方法,用于快速实现对象的深拷贝。 -
使用对象池:如果你需要频繁地拷贝对象,可以考虑使用对象池,对象池在初始阶段创建一组对象,并在需要时从池中获取和返回对象,以避免频繁地创建和销毁对象。
-
考虑重构:有时性能问题可能源于对象本身的设计,在某些情况下,可以通过优化对象的结构或减少不必要的字段来改善性能。

四、学习什么是原型模式
原型模式是一种创建型设计模式 \color{red}{原型模式是一种创建型设计模式} 原型模式是一种创建型设计模式,其主要目的是通过复制或克隆现有对象来创建新对象,而无需依赖于显式的实例化过程。
原型模式通过复制现有对象的状态来创建新对象,从而避免了直接创建新对象的开销,原型模式可以通过实现 Cloneable 接口和重写 clone() 方法来实现。
在原型模式中,原型对象作为被复制的对象,可以称为原型。克隆方法是原型模式的核心部分,它定义了如何复制原型对象。通过克隆方法,我们可以创建一个与原型对象具有相同状态的新对象。
原型模式的主要优点是可以在运行时动态创建对象 \color{red}{原型模式的主要优点是可以在运行时动态创建对象} 原型模式的主要优点是可以在运行时动态创建对象,避免了显式的实例化过程,提高了创建对象的效率。它还提供了一种简单的方式来创建具有相同状态的对象,通过修改克隆得到的对象,可以满足不同的需求。另外,原型模式也能够隐藏对象的创建细节,使得客户端代码与具体类解耦。
但在使用原型模式需要注意一些问题。首先克隆对象可能包含对其他对象的引用,这可能导致对象图的复制,需要特别小心处理。其次,克隆过程可能会比直接创建对象更复杂,需要对克隆方法进行合理的实现。
原型模式提供了一种创建对象的简单而高效的方式,可以在运行时动态地创建具有相同状态的新对象,它在需要创建相似对象或隐藏对象创建细节时非常有用。

五、原型模式上手实战
以下是一个使用原型模式的 Java 代码示例,请同学们复制到本地执行。
// 原型接口
interface Prototype extends Cloneable {Prototype clone();
}// 具体原型类
class ConcretePrototype implements Prototype {private String name;public ConcretePrototype(String name) {this.name = name;}public void setName(String name) {this.name = name;}public String getName() {return name;}@Overridepublic Prototype clone() {try {return (Prototype) super.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();return null;}}
}// 客户端代码
public class Client {public static void main(String[] args) {ConcretePrototype prototype = new ConcretePrototype("Prototype 1");System.out.println("Original object: " + prototype.getName());ConcretePrototype clonedObject = (ConcretePrototype) prototype.clone();System.out.println("Cloned object: " + clonedObject.getName());clonedObject.setName("Prototype 2");System.out.println("Modified cloned object: " + clonedObject.getName());}
}
在上面的示例中,我们定义了一个原型接口 Prototype,其中包含了一个 clone() 方法用于复制自身对象。
然后,我们创建了一个具体的原型类 ConcretePrototype,实现了 Prototype 接口,并重写了 clone() 方法。
在客户端代码中,我们首先创建了一个原型对象 prototype,然后通过调用 clone() 方法来复制原型对象,得到一个克隆对象 clonedObject。
通过修改克隆对象的属性,我们可以验证克隆对象和原型对象是相互独立的,互不影响。
六、原型模式的应用场景
原型模式通常在以下 3 3 3 类开发场景下使用,请同学们有个简单的了解。
- 需要创建一个对象的成本较大,例如涉及到数据库操作、网络请求等耗时操作。
- 需要创建的对象与已有对象具有相似的属性,只有部分属性需要修改。
- 需要隐藏对象的创建细节,使客户端代码与具体类解耦。
当然,还有一些应用场景,需要用到原型模式。
- 复杂对象的创建:当创建一个复杂对象的过程很繁琐或耗时时,可以使用原型模式来复制一个已有对象,避免重复创建。
- 原型注册表:使用原型模式可以创建一个对象的集合,并在需要时从集合中复制已有对象,提高对象的创建效率。
- 工厂方法模式的替代:原型模式可以作为工厂方法模式的替代,当需要创建的对象具有相同的基类或接口,并且只有部分属性需要修改时,原型模式比工厂方法模式更加灵活。
总之,原型模式适用于创建成本高、创建过程复杂或需要隐藏创建细节的对象,通过克隆现有对象来创建新对象,可以提高创建对象的效率,同时也能够灵活地满足不同的需求。

七、原型模式面试题
一、什么是原型模式? \color{red}{一、什么是原型模式?} 一、什么是原型模式?
原型模式是一种创建型设计模式,通过复制或克隆现有对象来创建新对象,而无需依赖于显式的实例化过程。
二、如何实现原型模式? \color{red}{二、如何实现原型模式?} 二、如何实现原型模式?
在Java中,可以通过实现Cloneable接口和重写clone()方法来实现原型模式。clone()方法可以复制现有对象的状态,并创建一个与原型对象具有相同状态的新对象。
三、克隆方法与构造方法有什么区别? \color{red}{三、克隆方法与构造方法有什么区别?} 三、克隆方法与构造方法有什么区别?
克隆方法是在现有对象的基础上创建一个新对象,而构造方法是通过实例化类来创建新对象。克隆方法可以复制现有对象的状态,而构造方法需要手动设置新对象的状态。
四、原型模式的优点是什么? \color{red}{四、原型模式的优点是什么?} 四、原型模式的优点是什么?
原型模式可以在运行时动态创建对象,避免了显式的实例化过程,提高了创建对象的效率。它还提供了一种简单的方式来创建具有相同状态的对象,并能够隐藏对象的创建细节,使得客户端代码与具体类解耦。
五、原型模式的适用场景有哪些? \color{red}{五、原型模式的适用场景有哪些?} 五、原型模式的适用场景有哪些?
原型模式适用于创建成本高、创建过程复杂或需要隐藏创建细节的对象。一些常见的应用场景包括复杂对象的创建、原型注册表和作为工厂方法模式的替代。
六、原型模式的局限性是什么? \color{red}{六、原型模式的局限性是什么?} 六、原型模式的局限性是什么?
使用原型模式需要注意克隆对象可能包含对其他对象的引用,这可能导致对象图的复制,需要特别小心处理。克隆过程可能会比直接创建对象更复杂,需要对克隆方法进行合理的实现。
八、文末福利
为了回馈粉丝们的大力支持,博主争取到了出版社的活动参与资格,和清华大学出版社一起给粉丝们送书啦!
第一期送给粉丝们的是《Java 从入门到精通(第 7 版)》,Java入门经典,95 万 Java 程序员的入行选择,图书介绍如下。
本书从初学者角度出发,通过通俗易懂的语言、丰富多彩的实例,详细讲解了使用Java语言进行程序开发需要掌握的知识。书中所有知识都结合具体实例进行讲解,涉及的程序代码都给出了详细的注释,这可以帮助读者轻松领会Java程序开发的精髓,并快速提高开发技能。
图书购买链接:京东商城、当当网。

活动奖励: 《 J a v a 从入门到精通(第 7 版)》 \color{red}{《Java 从入门到精通(第 7 版)》} 《Java从入门到精通(第7版)》包邮。
参与方式: 点赞 + 收藏 + 评论本博客即可参与 \color{red}{点赞+收藏+评论本博客即可参与} 点赞+收藏+评论本博客即可参与。
开奖时间:2023 年 9 月 12 日。
通知方式:CSDN 私信。

相关文章:
文末送书!谈谈原型模式在JAVA实战开发中的应用(附源码+面试题)
作者主页:Designer 小郑 作者简介:3年JAVA全栈开发经验,专注JAVA技术、系统定制、远程指导,致力于企业数字化转型,CSDN博客专家,蓝桥云课认证讲师。 本文讲解了 Java 设计模式中的原型模式,并给…...
视频汇聚/视频云存储/视频监控管理平台EasyCVR启动时打印starting server:listen tcp,该如何解决?
视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同,可实现视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、H.265自动转码H.264、平台级联等。为了便于用户二次开发、调用与集成,…...
【Linux从入门到精通】通信 | 管道通信(匿名管道 命名管道)
本派你文章主要是对进程通信进行详解。主要内容是介绍 为什么通信、怎么进行通信。其中本篇文章主要讲解的是管道通信。希望本篇文章会对你有所帮助。 文章目录 一、进程通信简单介绍 1、1 什么是进程通信 1、2 为什么要进行通信 1、3 进程通信的方式 二、匿名管道 2、1 什么是…...
实践和项目:解决实际问题时,选择合适的数据结构和算法
文章目录 选择合适的数据结构数组链表栈队列树图哈希表 选择合适的算法实践和项目 🎉欢迎来到数据结构学习专栏~实践和项目:解决实际问题时,选择合适的数据结构和算法 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒🍹✨博客主页:IT…...
上线检查工具(待完善)
根据V11《CEBPM系统上线CheckList》整理而得,适用于V11,DHERP,Oracle和MSSQL数据库,检查内容还不完善。 上图: 1)数据库连接 2)双击[连接别名],可选择历史连接 3)主界面…...
PE文件格式详解
摘要 本文描述了Windows系统的PE文件格式。 PE文件格式简介 PE(Portable Executable)文件格式是一种Windows操作系统下的可执行文件格式。PE文件格式是由Microsoft基于COFF(Common Object File Format)格式所定义的,…...
【Alibaba中间件技术系列】「RocketMQ技术专题」RocketMQ消息发送的全部流程和落盘原理分析
RocketMQ目前在国内应该是比较流行的MQ 了,目前本人也在公司的项目中进行使用和研究,借着这个机会,分析一下RocketMQ 发送一条消息到存储一条消息的过程,这样会对以后大家分析和研究RocketMQ相关的问题有一定的帮助。 分析的总体…...
关于vue首屏加载loading问题
注意:网上搜索出来的都是教你在index.html里面<div id"app"><div class"loading"></div>或者在app.vue Mounte生命周期函数控制app和loading的显示和隐藏,这里会有一个问题,就是js渲染页面需要时间,一…...
数据库性能测试实践:慢查询统计分析
01、慢查询 查看是否开启慢查询 mysql> show variables like %slow%’; 如图所示: 系统变量log_slow_admin_statements 表示是否将慢管理语句例如ANALYZE TABLE和ALTER TABLE等记入慢查询日志启用log_slow_extra系统变量 (从MySQL 8.0.14开始提供&a…...
windows wsl ssh 配置流程 Permission denied (publickey)
wsl ssh连接失败配置流程 1、wsl2 ifconfig的网络ip是虚拟的ip,所以采用wsl1 2、wsl1的安装教程。 3、openssh-server重装 sudo apt-get update sudo apt-get remove openssh-server sudo apt-get install openssh-server4、修改ssh配置文件 sudo vim /etc/ss…...
OpenCV(五):图像颜色空间转换
目录 1.图像颜色空间介绍 RGB 颜色空间 2.HSV 颜色空间 3.RGBA 颜色空间 2.图像数据类型间的互相转换convertTo() 3.不同颜色空间互相转换cvtColor() 4.Android JNI demo 1.图像颜色空间介绍 RGB 颜色空间 RGB 颜色空间是最常见的颜色表示方式之一,其中 R、…...
一图胜千言!数据可视化多维讲解(Python)
数据聚合、汇总和可视化是支撑数据分析领域的三大支柱。长久以来,数据可视化都是一个强有力的工具,被业界广泛使用,却受限于 2 维。在本文中,作者将探索一些有效的多维数据可视化策略(范围从 1 维到 6 维)。…...
Hbase相关总结
Hbase 1、Hbase的数据写入流程 由客户端发起写入数据的请求, 首先会先连接zookeeper 从zookeeper中获取到当前HMaster的信息,并与HMaster建立连接从HMaster中获取RegionServer列表信息 连接meta表对应的RegionServer地址, 从meta表获取当前要写入的表对应region被那个RegionS…...
C++ Primer Plus第二章编程练习答案
答案仅供参考,实际运行效果取决于运行平台和运行软件 1.编写一个C程序,它显示您的姓名和地址。 #include <iostream> using namespace std;int main() {cout << "My name is sakuraaa0908 C Primer Plus." << endl;cout &…...
Web后端开发(请求响应)上
请求响应的概述 浏览器(请求)<--------------------------(HTTP协议)---------------------->(响应)Web服务器 请求:获取请求数据 响应:设置响应数据 BS架构:浏览器/服务器架构模式。…...
LeetCode 338. Counting Bits【动态规划,位运算】简单
本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…...
解释 Git 的基本概念和使用方式。
Git 是一种分布式版本控制系统,它可以跟踪文件的修改历史、协调多个人员的工作、将分支合并到一起等。下面是 Git 的一些基本概念和使用方式。 - 仓库(Repository):存储代码、版本控制历史记录等的地方。 - 分支(Bran…...
计算机网络初识
目录 1、计算机网络背景 网络发展 认识 "协议" 2、网络协议初识 OSI七层模型 TCP/IP五层(或四层)模型 3、网络传输基本流程 网络传输流程图 数据包封装和分用 4、网络中的地址管理 认识IP地址 认识MAC地址 1、计算机网络背景 网络发展 在之前呢&…...
python 笔记(2)——文件、异常、面向对象、装饰器、json
目录 1、文件操作 1-1)打开文件的两种方式: 1-2)文件操作的简单示例: write方法: read方法: readline方法: readlines方法: 2、异常处理 2-1)不会中断程序的异常捕获和处理…...
Meta AI的Nougat能够将数学表达式从PDF文件转换为机器可读文本
大多数科学知识通常以可移植文档格式(PDF)的形式存储,这也是互联网上第二突出的数据格式。然而,从这种格式中提取信息或将其转换为机器可读的文本具有挑战性,尤其是在涉及数学表达式时。 为了解决这个问题,…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...
leetcode73-矩阵置零
leetcode 73 思路 记录 0 元素的位置:遍历整个矩阵,找出所有值为 0 的元素,并将它们的坐标记录在数组zeroPosition中置零操作:遍历记录的所有 0 元素位置,将每个位置对应的行和列的所有元素置为 0 具体步骤 初始化…...
CTF show 数学不及格
拿到题目先查一下壳,看一下信息 发现是一个ELF文件,64位的 用IDA Pro 64 打开这个文件 然后点击F5进行伪代码转换 可以看到有五个if判断,第一个argc ! 5这个判断并没有起太大作用,主要是下面四个if判断 根据题目…...
【Ftrace 专栏】Ftrace 参考博文
ftrace、perf、bcc、bpftrace、ply、simple_perf的使用Ftrace 基本用法Linux 利用 ftrace 分析内核调用如何利用ftrace精确跟踪特定进程调度信息使用 ftrace 进行追踪延迟Linux-培训笔记-ftracehttps://www.kernel.org/doc/html/v4.18/trace/events.htmlhttps://blog.csdn.net/…...
欢乐熊大话蓝牙知识17:多连接 BLE 怎么设计服务不会乱?分层思维来救场!
多连接 BLE 怎么设计服务不会乱?分层思维来救场! 作者按: 你是不是也遇到过 BLE 多连接时,调试现场像网吧“掉线风暴”? 温度传感器连上了,心率带丢了;一边 OTA 更新,一边通知卡壳。…...
(12)-Fiddler抓包-Fiddler设置IOS手机抓包
1.简介 Fiddler不但能截获各种浏览器发出的 HTTP 请求,也可以截获各种智能手机发出的HTTP/ HTTPS 请求。 Fiddler 能捕获Android 和 Windows Phone 等设备发出的 HTTP/HTTPS 请求。同理也可以截获iOS设备发出的请求,比如 iPhone、iPad 和 MacBook 等苹…...
7种分类数据编码技术详解:从原理到实战
在数据分析和机器学习领域,分类数据(Categorical Data)的处理是一个基础但至关重要的环节。分类数据指的是由有限数量的离散值组成的数据类型,如性别(男/女)、颜色(红/绿/蓝)或产品类…...
2025-06-08-深度学习网络介绍(语义分割,实例分割,目标检测)
深度学习网络介绍(语义分割,实例分割,目标检测) 前言 在开始这篇文章之前,我们得首先弄明白,什么是图像分割? 我们知道一个图像只不过是许多像素的集合。图像分割分类是对图像中属于特定类别的像素进行分类的过程,即像素级别的…...
