Java23种设计模式-创建型模式之原型模式

原型模式(Prototype Pattern)是一种创建型设计模式,它允许通过复制现有对象生成新对象,而无需编写从头开始创建新对象的代码。

优点:可以克隆对象,无需与它们所属的具体类相耦合;可以克隆预生成原型,避免反复运行初始化代码;提高性能等。
缺点:克隆包含循环引用的复杂对象可能会非常麻烦;配备克隆方法需要对类的功能进行通盘考虑必须实现Cloneable接口
实现方式
浅克隆:创建一个新对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原有属性所指向的对象的内存地址
深克隆:创建一个新对象,属性中引用的其他对象也会被克隆不再指向原有对象地址

使用场景
1.类初始化需要消化非常多的资源,包括数据、硬件资源。
2.通过new产生一个对象需要非常繁琐的数据准备或访问权限。
3.一个对象多个修改者的场景。

工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建,即“对象.clone( )”
示例:设置一个原型类MyObject 然后创建深拷贝类MyObjectDeepClone 和浅拷贝类MyObjectShallowClone 最后创建一个测试类Client 然后修改数据 打印查看即可知浅拷贝和深拷贝区别。

//原型类
class MyObject {private int basicField;private List<String> objectField;public int getBasicField() {return basicField;}public void setBasicField(int basicField) {this.basicField = basicField;}public List<String> getObjectField() {return objectField;}public void setObjectField(List<String> objectField) {this.objectField = objectField;}public MyObject(int basicField, List<String> objectField) {this.basicField = basicField;this.objectField = new ArrayList<>(objectField);}@Overridepublic String toString() {return "MyObject{" +"basicField=" + basicField +", objectField=" + objectField +'}';}
}//深拷贝
class MyObjectDeepClone {private MyObject innerObject;public MyObjectDeepClone(MyObject innerObject) {this.innerObject = new MyObject(innerObject.getBasicField(), new ArrayList<>(innerObject.getObjectField()));}public MyObjectDeepClone deepClone() {return new MyObjectDeepClone(new MyObject(innerObject.getBasicField(), new ArrayList<>(innerObject.getObjectField())));}@Overridepublic String toString() {return "MyObjectDeepClone{" +"innerObject=" + innerObject +'}';}
}
//浅拷贝
class MyObjectShallowClone implements Cloneable {private MyObject innerObject;public MyObjectShallowClone(MyObject innerObject) {this.innerObject = innerObject;}public MyObjectShallowClone clone() {try {return (MyObjectShallowClone) super.clone();} catch (CloneNotSupportedException e) {throw new Error("This shouldn't happen", e);}}@Overridepublic String toString() {return "MyObjectShallowClone{" +"innerObject=" + innerObject +'}';}
}
//验证测试
public class Client {public static void main(String[] args) throws Exception {List<String> objectField =new ArrayList<>();objectField.add("aaaa");//原始类MyObject myObject=new MyObject(1,objectField);//深拷贝MyObjectDeepClone myObjectDeepClone = new MyObjectDeepClone(myObject);//浅拷贝MyObjectShallowClone myObjectShallowClone=new MyObjectShallowClone(myObject);//深拷贝打印System.out.println(myObjectDeepClone);//MyObjectDeepClone{innerObject=MyObject{basicField=1, objectField=[aaaa]}}//浅拷贝System.out.println(myObjectShallowClone);//MyObjectShallowClone{innerObject=MyObject{basicField=1, objectField=[aaaa]}}//修改原始数据objectField.add("ssss");myObject.setObjectField(objectField);//打印判断是否变化,输出发生变化的为浅拷贝System.out.println(myObjectShallowClone);//MyObjectShallowClone{innerObject=MyObject{basicField=1, objectField=[aaaa, ssss]}}System.out.println(myObjectDeepClone);//MyObjectDeepClone{innerObject=MyObject{basicField=1, objectField=[aaaa]}}}
}

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

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

相关文章

Java代码审计-flink-streaming-platform-web

前言 项目地址&#xff1a;GitHub - zhp8341/flink-streaming-platform-web: 基于flink的实时流计算web平台 flink-streaming-platform-web是一个将flink封装的一个可视化的、轻量级的flink web客户端系统&#xff0c;用户只需在web 界面进行sql配置就能完成流计算任务。 项目…

海外IP代理中的HTTP/SOCKS5协议都有哪些区别?

随着互联网大数据的兴起&#xff0c;代理ip也成为了很多用户完成任务时不可缺少的部分&#xff0c;代理ip随着出现的主要作用是变换ip&#xff0c;突破ip限制等问题&#xff0c;使用过代理ip的用户都知道&#xff0c;代理ip分为很多种&#xff0c;长效&#xff0c;短效及不同协…

【Elasticsearch<一>✈️✈️】简单安装使用以及各种踩坑

目录 &#x1f378;前言 &#x1f37b;一、软件安装&#xff08;Windows版&#xff09; 1.1、Elasticsearch 下载 2.1 安装浏览器插件 3.1、安装可视化工具 Kibana 4.1、集成 IK 分词器 &#x1f37a;二、安装问题 &#x1f379;三、测试 IK 分词器 ​&#x1f377; 四、章…

可以根据linux终端指令 得出.db文件的数据库类型吗

可以根据.db文件得出数据库的的类型吗 根据提供的引用内容&#xff0c;可以根据.db文件得出数据库的类型。具体的方法是通过查看.db文件的文件头来确定数据库类型。不同的数据库类型有不同的文件头标识符。例如&#xff0c;SQLite数据库的文件头标识符是"SQLite format 3…

动态规划入门和应用示例

文章目录 前言斐波那契数列爬楼梯总结优点&#xff1a;缺点&#xff1a; 前言 动态规划&#xff08;Dynamic Programming&#xff0c;DP&#xff09;是运筹学的一个分支&#xff0c;是求解决策过程最优化的数学方法。它主要用于解决一类具有重叠子问题和最优子结构性质的问题。…

mysql允许ip远程访问

1.找到自己mysql所安装数据库的bin目录地址 例如&#xff1a;G:\mysql-5.7.23-winx64\bin 2.搜索cmd打开命令提示符进入这个bin目录 注意:如果目录不在c盘需要切换盘符。 切换访问步骤如下&#xff08;如上例子在G盘&#xff09; &#xff08;1&#xff09;先输入 g: &am…

Golang | Leetcode Golang题解之第55题跳跃游戏

题目&#xff1a; 题解&#xff1a; // 贪心算法 func canJump(nums []int) bool {cover : 0n : len(nums)-1for i : 0; i < cover; i { // 每次与覆盖值比较cover max(inums[i], cover) //每走一步都将 cover 更新为最大值if cover > n {return true}}return false } …

CHATGPT对写作业的好处

原文&#xff1a;chatGPT对写作业的好处 - 夸智网 本文目录一览1、chatGPT对写作业的好处2、chatGPT批改作业3、chatGPT完成作业4、chatGPT写作业水平超过大学生5、美国大学生用chatGPT写作业大家好&#xff0c;今天来为您分享chatGPT对写作业的好处的一些知识&#xff0c;本文…

如何买到“30元以下”的免备案服务器?

对于预算有限的个人和小型企业来说&#xff0c;30 元以下免备案服务器的价格非常亲民。用户可以以极低的成本获得所需的服务器资源&#xff0c;这对创业者、个人开发者、学生和站长来说简直不要太划算&#xff0c;毕竟配置可以升级真不够后面再付费升级也行。 何为“免备案”&…

Android双向认证配置过程

1&#xff08;可以绕过&#xff09;准备过程 为了让这个教程可以一直复用&#xff0c;打算直接写一个双向认证的APP作为素材。 工具&#xff1a; ●protecle&#xff08;签名文件转换&#xff09; ●keytool&#xff08;java自己就有&#xff09; ●openssl&#xff08;apache里…

NLP transformers - 文本分类

Text classification 文章目录 Text classification加载 IMDb 数据集Preprocess 预处理EvaluateTrainInference 本文翻译自&#xff1a;Text classification https://huggingface.co/docs/transformers/tasks/sequence_classification notebook : https://colab.research.googl…

FPGA 以太网概念简单学习

1 MAC和PHY 从硬件的角度来说&#xff0c;以太网接口电路主要由 MAC &#xff08; Media Access Control &#xff09;控制器和物理层接口 PHY&#xff08;Physical Layer &#xff0c; PHY &#xff09;两大部分构成。 MAC 指媒体访问控制子层协议&#xff0c;它和 PHY 接…

创建获利段

事务代码&#xff1a;KE21N BAPI&#xff1a;BAPI_COPAACTUALS_POSTCOSTDATA 前台操作&#xff1a; 表是业务配置的 配置路径&#xff1a; 代码&#xff1a;BAPI不返回生成的凭证号和获利段&#xff0c;需要通过增强或者读表获取 ls_copa_data-record_id 000001.ls_co…

Agent AI智能体在未来,一定与你我密不可分

随着Agent AI智能体的逐渐成熟&#xff0c;人工智能应用的不断深入与拓展&#xff0c;相信在不久的将来&#xff0c;他与你我的生活一定是密不可分的。 目录 ​编辑 1 Agent AI智能体是什么&#xff1f; 2 Agent AI在语言处理方面的能力 2.1 情感分析示例 2.2 文本分类任…

Spring - 5 ( 8000 字 Spring 入门级教程 )

一&#xff1a;Spring IoC&DI 1.1 方法注解 Bean 类注解是添加到某个类上的&#xff0c; 但是存在两个问题: 使用外部包里的类, 没办法添加类注解⼀个类, 需要多个对象, ⽐如多个数据源 这种场景, 我们就需要使用方法注解 Bean 我们先来看方法注解如何使用: public c…

Unity 踩坑记录 Rigidbody 刚体重力失效

playerSetting > physics > Gravity > 设置 Y 的值为负数

前端canvas项目实战——在线图文编辑器(九):逻辑画布

目录 前言一、 效果展示二、 实现步骤1. 调整布局&#xff0c;最大化利用屏幕空间2. 添加逻辑画布3. 添加遮罩4. 居中显示逻辑画布5. 一个容易被忽视的bug点 三、Show u the code后记 前言 上一篇博文中&#xff0c;我们实现了一组通用的功能按钮&#xff1a;复制、删除、锁定…

FreeRTOS之列表

1.FreeRTOS的列表和列表项十分重要。列表类相当于链表&#xff0c;列表项则相当于链表中的节点。列表项的地址是非连续的&#xff0c;列表项的数量可随时修改。在OS中的任务状态和数量会发生改变&#xff0c;因此使用列表可以很好的满足需求。 列表和列表项的相关定义与操作函…

电商独立站||跨境电商独立站网站搭建|功能系统搭建||API接口接入

搭建多语言跨境电商独立站系统 前台主要功能模块 短信接口 第三方登陆 支付方式 会员中心 代购订单列表 - new 会员签到 -1000(1) new 支付密码 ---1000 国内流程 -----5000 new 订单运单多退少补 -1000 未付款运单取消功能 - 修改运单运输方式 -----1000 年费会员 -----3000 …

D435+opencv识别色块

在当前的机器视觉和机器人技术领域&#xff0c;实时图像处理是一项至关重要的技术。本文介绍了如何利用Python、OpenCV库以及Intel的Realsense摄像头来进行实时的颜色识别。这种技术可以广泛应用于自动化检测、机器人导航以及交互式媒体等领域。 一、 开发环境配置 首先&#x…