Java原型模式源码剖析及使用场景

一、 项目案例

在项目开发中,我们可以在需要创建复杂对象或者需要大量创建对象的场景下使用原型模式。比如,我们需要在内存中缓存大量的图像对象,每个图像对象都包含了一些元数据信息。如果每次都从头创建一个新的图像对象,势必会消耗大量的系统资源。

这时,我们可以使用原型模式来解决这个问题。首先,我们创建一个原型图像对象,并初始化它的元数据信息。然后,每当我们需要创建一个新的图像对象时,只需要从原型对象上克隆一个副本出来,就可以避免重复创建对象的开销。

// 图像对象
public class Image implements Cloneable {private String name;private byte[] data;private int width;private int height;// 构造函数和getter/setter方法...@Overridepublic Object clone() throws CloneNotSupportedException {return super.clone();}
}// 原型管理器
public class PrototypeManager {private static Map<String, Image> prototypes = new HashMap<>();public static void addPrototype(String name, Image image) {prototypes.put(name, image);}public static Image getPrototype(String name) throws CloneNotSupportedException {return (Image) prototypes.get(name).clone();}
}

在上面的示例中,我们定义了一个Image类,实现了Cloneable接口,允许对象被克隆。PrototypeManager类充当了原型管理器的角色,它维护了一个原型对象的映射表,通过addPrototype()方法可以添加新的原型对象,通过getPrototype()方法可以获取一个原型对象的克隆副本。

二、Java源码案例

在Java标准库中,Object类提供了clone()方法,允许对象克隆自身。这就是原型模式在Java中的一个体现。不过,由于Object类的clone()方法是一个受保护的方法,所以如果要使用这个方法,必须在自定义的类中重写它。

public class MyClass implements Cloneable {// 其他属性和方法...@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}

在上面的示例中,MyClass实现了Cloneable接口,并重写了clone()方法。当调用myObject.clone()时,就会创建一个myObject的克隆副本。

需要注意的是,Object类的clone()方法执行的是浅拷贝,如果对象中包含其他对象的引用,那么这些引用指向的对象并不会被克隆。如果需要执行深拷贝,就需要在自定义的clone()方法中手动实现对引用对象的克隆。

三、原型模式分浅拷贝和深拷贝
Java 中的原型模式提供了一种创建对象的简单方式,通过将一个对象复制出一个新的实例来创建新对象。在复制对象时,Java 提供了两种不同的方式:浅拷贝(Shallow Copy)和深拷贝(Deep Copy)。

1.浅拷贝(Shallow Copy)

浅拷贝是指创建一个新对象,然后将当前对象的非静态字段值复制到该新对象中。但是,如果字段是引用类型,则会将引用地址复制给新对象,因此新对象和原对象引用同一个对象。换句话说,新对象和原对象仍然共享部分内存空间。

public class Employee implements Cloneable {private int id;private String name;private Department department; // 引用类型// 浅拷贝实现@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}// 构造函数、getter、setter// ...
}public class Department {private String name;// ...
}

在上面的示例中,如果我们对 Employee 对象进行浅拷贝,则新对象的 department 字段将引用与原对象相同的 Department 对象。因此,如果修改了新对象的 department 字段,原对象的 department 字段也会受到影响。

2.深拷贝(Deep Copy)

深拷贝是指创建一个新对象,并且递归复制当前对象所引用的对象。也就是说,对于所有的引用类型字段,都将创建一个新的对象并复制其中的内容。这样,新对象和原对象之间就完全分离开来,互不影响。

public class Employee implements Cloneable {private int id;private String name;private Department department; // 引用类型// 深拷贝实现@Overrideprotected Object clone() throws CloneNotSupportedException {Employee clone = (Employee) super.clone();clone.department = (Department) department.clone(); // 对引用类型字段进行深拷贝return clone;}// 构造函数、getter、setter// ...
}public class Department implements Cloneable {private String name;@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}// 构造函数、getter、setter// ...
}

在上面的示例中,我们实现了 Employee 类的深拷贝。当克隆一个 Employee 对象时,不仅会复制基本类型字段,还会递归复制引用类型字段 department。因此,新对象和原对象的 department 字段指向不同的对象,修改新对象的 department 字段不会影响到原对象。需要注意的是,深拷贝通常会比浅拷贝更加复杂和耗时,因为需要递归复制所有引用类型的对象。

原型模式通过对象克隆的方式来创建新的对象,避免了重复创建对象的开销,提高了系统的性能和效率。在实际项目中,我们可以根据具体情况选择是否使用原型模式,特别是在需要创建大量复杂对象的场景下,原型模式会非常有用。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# 数据结构初始化

在C#中&#xff0c;可以使用各种不同的数据结构来存储和操作数据。以下是一些常见数据结构的初始化示例&#xff1a; 1.数组 (Array): // 声明并初始化整型数组 int[] intArray new int[] { 1, 2, 3, 4, 5 };// 声明并初始化字符串数组 string[] stringArray new string[] …

Linux的一些常用指令

一、文件中 r w x - 的含义 r&#xff08;read&#xff09;是只读权限&#xff0c; w&#xff08;write&#xff09;是写的权限&#xff0c; x&#xff08;execute&#xff09;是可执行权限&#xff0c; -是没有任何权限。 二、一些指令 # 解压压缩包 tar [-zxvf] 压缩包名…

知名Web3 风险投资公机构Hack VC 四位合伙人将亲临hack.summit()2024亚洲区块链开发者大会

2024-03-14 15:32:24 知名web3风险投资机构Hack VC的四位合伙人——Alex Pack、Ed Roman、Roshun Patel和Rodney Yesep将亲临hack.summit()2024亚洲区块链开发者大会&#xff0c;这一盛事将于2024年4月9日至10日在香港数码港举行。 此次大会由Hack VC主办&#xff0c;并得到Alt…

AI预测福彩3D第8弹【2024年3月14日预测--新算法重新开始计算第五次测试】

兄弟们&#xff0c;感觉要起飞了&#xff01;截止昨天&#xff0c;经过新修正的算法进行3D预测&#xff0c;已经连续3次命中7码了&#xff0c;甚至6码或5码就能命中&#xff01; 昨天的开奖是 3 4 9,我的预测结果可参加上一篇文章 继续乘胜追击&#xff0c;再接再厉&#xff0…

设计一些策略和技术来防止恶意爬虫

当涉及到反爬虫时&#xff0c;我们需要设计一些策略和技术来防止恶意爬虫访问我们的网站。以下是一个简单的反爬虫框架示例&#xff0c;供您参考&#xff1a; import requests from bs4 import BeautifulSoup import timeclass AntiScrapingFramework:def __init__(self, targ…

Linux-vim显示乱码

Linux运维工具-ywtool 目录 一.问题二.解决2.1 编辑VIM的配置文件2.2 添加以下内容 一.问题 用vim编辑的时候,中文显示乱码 二.解决 2.1 编辑VIM的配置文件 vim ~/.vimrc #如果这个文件不存在,创建一个即可2.2 添加以下内容 添加完成以后就不会在出现中文乱码了 set fil…

ECRS软件:通过视频分析实现精益生产的利器

在追求高效生产的现代工业体系中&#xff0c;精准的数据分析和科学的流程管理是企业不可或缺的核心竞争力。ECRS软件作为一款专业的工时分析工具&#xff0c;通过视频分析的方式&#xff0c;为企业的精益生产提供了有力支持。使用ECRS软件&#xff0c;企业只需完成三项基础操作…

spring-authorization-server如何通过JWK Set Endpoint来获取公钥并验签的

参考文档&#xff1a;spring-authorization-server【版本1.2.2】 问题 在spring-authorization-server官方文档中提供了JWK Set Endpoint相关介绍&#xff0c;此端点主要返回JWK Set &#xff0c;此JWK Set包含了授权服务提供的所有公钥集&#xff0c;具体可通过访问端点&…

k8s排错指南

一、排查顺序&#xff1a; 查看node状态→查看pod状态→查看container状态→查看service流量是否路由到pod→查看ingress配置是否正确→查看kubelet系统日志 二、具体排查思路&#xff1a; 1、排查node故障&#xff1a; #查看各节点状态&#xff1a; kubectl get node <…

Windows10安装RubyRails步骤

2024年3月14日安装&#xff0c;亲测。记录一下以便后续需要查看。 首先在官网下载RubyInstaller for Windows - 国内镜像 rubyinstaller.cn 版本是3.3.0 下载完后图形化界面安装 安装完毕&#xff0c;出现Ruby的命令行&#xff0c;或者在开始菜单出现start command prompt wi…

纯血鸿蒙来画龙!基于HarmonyOS ArkTS来操作SVG图片

大家好&#xff0c;龙年报喜&#xff0c;大地回春&#xff0c;作为程序员&#xff0c;以代码之名&#xff0c;表达对于龙年的祝福。本节将演示如何在基于HarmonyOS ArkTS的Image组件来实现画一条中国龙&#xff0c;祝大家“码”上“鸿”福到&#xff01; 创建应用 选择空模板…

Xcode下载模拟器报错Could not download iOS 17.4 Simulator (21E213).

xcode14以后最小化安装包&#xff0c;从而将模拟器不集中在安装包中 因此xcode14至以后的版本安装后第一次启动会加载提示安装模拟器的提示框 或者根据需要到xcode中进行所需版本|平台的模拟器进行安装 Xcode > Settings > Platforms 问题来了尝试多次都安装失败例如…

FreeRTOS 的任务创建和删除

任务创建是我们第一个要学习的 API 函数&#xff0c;同时它也是 FreeRTOS 众多 API 函数中最复杂的一个&#xff0c;但是没办法&#xff0c;这个函数是我们第一个要学习的&#xff0c;也是非常重要的。 那么来看一下咱们本节的主要内容有哪些&#xff1a; 首先我们来介绍一下…

4款实用性前端动画特效分享(附在线演示)

分享4款非常不错的项目动画特效 其中有jQuery特效、canvas特效、CSS动画等等 下方效果图可能不是特别的生动 那么你可以点击在线预览进行查看相应的动画特效 同时也是可以下载该资源的 全屏图片视差旋转切换特效 基于anime.js制作全屏响应式的图片元素布局&#xff0c;通过左…

Linux系统部署Swagger Editor结合内网穿透实现公网管理本地接口文档

文章目录 Swagger Editor本地接口文档公网远程访问1. 部署Swagger Editor2. Linux安装Cpolar3. 配置Swagger Editor公网地址4. 远程访问Swagger Editor5. 固定Swagger Editor公网地址 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xf…

一种基于宏和serde_json实现的rust web中统一返回类

本人rust萌新&#xff0c;写web碰到了这个&#xff0c;基于ChatGPT和文心一言学了宏&#xff0c;强行把这玩意实现出来了&#xff0c;做个学习记录&#xff0c;如果有更好的方法&#xff0c;勿喷。 先看效果&#xff0c;注意不支持嵌套&#xff0c;且kv映射要用>(因为它这个…

Hadoop大数据应用:Yarn 节点实现扩容与缩容

目录 一、实验 1.环境 2.Yarn 节点扩容 3.Yarn 节点缩容 二、问题 1.yarn启动服务报错 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 主机架构软件版本IP备注hadoop NameNode &#xff08;已部署&#xff09; SecondaryNameNode &#xff08;已部署&…

力扣● 392.判断子序列 ● 115.不同的子序列

● 392.判断子序列 可以直接使用双指针的方法&#xff0c;2个指针分别从s、t开头出发&#xff0c;时间复杂度为O(t.size())。 但是这里用动规来做。Carl&#xff1a;掌握本题的动态规划解法是对后面要讲解的编辑距离的题目打下基础。 so绕一下&#xff0c;用昨天的● 1143.最…

直排开料机:木工行业的效率革命者

在木工行业中&#xff0c;开料机作为关键的生产设备&#xff0c;其选择直接关系到生产效率和产品质量。近年来&#xff0c;直排开料机以其独特的优势逐渐崭露头角&#xff0c;成为了众多企业的首选。那么&#xff0c;直排开料机究竟有哪些令人瞩目的优势呢&#xff1f; 一、高…

CrossOver24软件免费电脑虚拟机,快速在Mac和Linux上运行Windows软件

当然&#xff0c;除了之前提到的核心技术、兼容性和性能优化外&#xff0c;CrossOver2024还具有其他一些值得关注的性能特点&#xff1a; CrossOver Mac-安装包下载如下&#xff1a;https://wm.makeding.com/iclk/?zoneid50028 CrossOver linux-安装包下载如下&#xff1a;ht…