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

embedded/2024/9/24 4:26:13/

原型模式(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.ppmy.cn/embedded/21895.html

相关文章

Linux中的vi与vim:编辑器的王者之争与深度探索

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Linux &#xff1a;从菜鸟到飞鸟的逆袭》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、前言 1、Linux的起源与发展 2、vi与vim的历史与发展 …

ASTM F3008-12(2020) 软木地砖检测

软木地砖是指含有烧结成分的软木制成的块状砖&#xff0c;可用于地面覆盖物&#xff0c;装饰层等&#xff0c;具有脚感柔软舒适&#xff0c;防滑性能好&#xff0c;静音等性能&#xff0c;同时也其耐磨性较差&#xff0c;不易清洁。 ASTM F3008-12(2020)软木地砖测试项目 测试…

用C++实现单例模式

单例模式&#xff08;Singleton Pattern&#xff09;是一种常用的软件设计模式&#xff0c;它保证一个类在整个应用程序中仅有一个实例&#xff0c;并提供一个全局访问点来获取这个实例。这种模式常用于那些需要频繁创建且消耗资源较多的对象&#xff0c;或者需要控制对共享资源…

IDM下载器_Internet Download Manager 6.42.7

网盘下载 IDM下载器是一款针对互联网所打造的下载管理器。IDM下载器能将下载速度提高5倍&#xff0c;恢复因丢失的连接&#xff0c;网络问题&#xff0c;计算机关闭或意外断电而重新启动中断或中断的下载。IDM下载器还可支持所有流行的浏览器&#xff0c;以使用独特的“高级浏…

JS----前端将列表数据转树型数据

前端将列表数据转树型数据 场景&#xff1a;后端返回列表数据&#xff0c;由前端根据业务需求完成树型数据转换&#xff0c; 常用于侧边导航菜单&#xff0c;下拉树型数据项等 export function listToTree(data: []) {var map: any {},tree: any []data.forEach((item: any…

Jmeter插件技术:性能测试中服务端资源监控

性能测试过程中我们需要不断的监测服务端资源的使用情况&#xff0c;例如CPU、内存、I/O等。 Jmeter的插件技术可以很好的实时监控到服务器资源的运行情况&#xff0c;并以图形化的方式展示出来&#xff0c;非常方便我们性能测试分析。 操作步骤&#xff1a; 1、安装插件管理…

【用户投稿】Apache SeaTunnel 2.3.3+Web 1.0.0版本安装部署

项目概要 Apache SeaTunnel 是一个分布式、高性能、易扩展的数据集成平台&#xff0c;用于实时和离线数据处理,支持多种数据源之间的数据迁移和转换。 其中&#xff0c;Apache-seatunnel-web-1.0.0-bin.tar.gz和apache-seatunnel-2.3.3-bin.tar.gz代表了 Apache SeaTunnel Web…

echarts实现水滴图

使用echarts实现水滴图 引入依赖&#xff0c;echarts-liquidfill3兼容echarts5; 安装依赖 "echarts": "^5.4.3","echarts-liquidfill": "^3.1.0",npm install echarts-liquidfill3.1.0 -S实现的效果图 构建一个水滴图的页面 <tem…