GoF设计模式(五) - 原型模式(浅复制与深复制)

Aspice的理解 ASPICE 是由汽车行业的主要公司和组织合作开发的,包括德国汽车工业联合会(VDA)和国际汽车工作组(Automotive SIG)。其目标是通过标准化的软件开发流程,提高汽车电子系统的软件质量和可靠性。 阅读详情

前言

原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能,通俗来讲就是从一个对象再创建另外一个可定制的对象,而且不需知道任何创建的细节,
这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。 

1. 浅复制

  创建Student对象实现Cloneable接口重写clone()方法

@ToString
public class Student implements Cloneable{
    //姓名
    private String name;
    //性别
    private String sex;
  
    public void setStudentInfo(String name,String sex){
        this.name = name;
        this.sex = sex;
    }

    @Override
    public Object clone() throws CloneNotSupportedException{
        return super.clone();
    }
}

 测试类:

@SpringBootTest
class PrototypeDemoApplicationTests {

	@Test
	void contextLoads() throws CloneNotSupportedException {
		Student student = new Student();
		student.setStudentInfo("张三","男");

		Student cloneStudent = (Student)student.clone();
		cloneStudent.setStudentInfo("李四","男");

		System.out.println(student.toString());
		System.out.println(cloneStudent.toString());
	}
}

 运行结果:

目前Student对象中都是String类型,而string是一种拥有值类型特点的特殊引用类型,重写了clone()后,当字段是值类型的,则会对该字段执行逐位复制,如果是引用类型则不会被克隆过来。
以示例说话

新增一个Address对象

@Data
public class Address {
    //省份
    private String province;
    //市
    private String city;
    //区
    private String area;
    //街道
    private String street;
}

Student对象改造

@ToString
public class Student implements Cloneable{
    //姓名
    private String name;
    //性别
    private String sex;
    //地址
    private Address address = new Address();

    public void setStudentInfo(String name,String sex){
        this.name = name;
        this.sex = sex;
    }

    public void setAddressInfo(String province, String city, String area, String street){
        address.setProvince(province);
        address.setCity(city);
        address.setArea(area);
        address.setStreet(street);
    }


    @Override
    public Object clone() throws CloneNotSupportedException{
        return super.clone();
    }
}

 测试类:

@SpringBootTest
class PrototypeDemoApplicationTests {

	@Test
	void contextLoads1() throws CloneNotSupportedException {
		Student student = new Student();
		student.setStudentInfo("张三","男");
		student.setAddressInfo("浙江省","杭州市","西湖区","xx街道");

		Student cloneStudent = (Student)student.clone();
		cloneStudent.setStudentInfo("李四","男");
		student.setAddressInfo("湖南省","长沙市","岳麓区","xx街道");


		System.out.println(student.toString());
		System.out.println(cloneStudent.toString());
	}

}

运行结果:

Object类提供的clone()方法只是拷贝本对象,对象内部的数组、引用对象等都不拷贝,还是指向原生对象的内部元素地址,这种拷贝就叫做浅拷贝。这种方式非常不安全,任何一个拷贝对象改变了私有变量的值,其他所有对象的变量的值都会随着改变。

 

2. 深复制

由于浅复制是有风险的 针对如上做出改动

Address对象改造 也实现Cloneable接口

@Data
public class Address implements Cloneable{
    //省份
    private String province;
    //市
    private String city;
    //区
    private String area;
    //街道
    private String street;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

Student对象改造

@ToString
public class Student implements Cloneable{
    //姓名
    private String name;
    //性别
    private String sex;
    //地址
    private Address address = new Address();

    public void setStudentInfo(String name,String sex){
        this.name = name;
        this.sex = sex;
    }

    public void setAddressInfo(String province, String city, String area, String street){
        address.setProvince(province);
        address.setCity(city);
        address.setArea(area);
        address.setStreet(street);
    }


    @Override
    public Object clone() throws CloneNotSupportedException{
        Student student = (Student) super.clone();
        student.address = (Address) this.address.clone();
        return student;
    }
}

 改造后运行结果

这样就实现了完全的拷贝,两个对象之间没有任何瓜葛,你改你的,我改我的,互不影响,这种拷贝就叫做深复制。

源码: https://download.youkuaiyun.com/download/javanbme/17853753

 

 

 

游戏引擎揭秘:大厂为何死磕自研? 游戏引擎本质与商业价值解析 游戏引擎是集成了渲染、物理、动画等核心功能的开发工具包,其价值在于让开发者免于重复编写底层代码,专注于游戏内容创作。商业引擎(如Unity/Unreal)虽降低了开发门槛,但头部厂商仍坚持自研引擎,主要基于以下考量: 经济性:长期项目分摊自研成本后,比商业引擎分成更划算; 可控性:完全掌握底层代码,能针对性优化核心玩法需求; 技术壁垒:专属引擎成为厂商的竞争优势,如米哈游的跨平台渲染技术; 项目适配:超大型游戏(开放世界/MMO)需要深度定制解决方案。 这种"短期高投入 阅读详情

相关推荐

【本体】Protege高效批量导入实例(Individuals)的自动化实践

本文详细介绍了在Protege中高效批量导入实例(Individuals)的自动化实践方法。通过分析Protege本体文件结构,提供Python脚本示例,帮助用户快速处理大规模数据导入,显著提升知识图谱构建效率。特别适合需要处理数千个实例的医疗、制药等领域应用。

weixin_30275415的博客 408

GOF23-原型模式

原型模式 原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。 介绍 意图: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 主要解决

Daylight629博客 214

深入解析Vivado FIFO的Standard与FWFT模式:性能对比与应用场景

本文深入解析了Vivado FIFO的Standard与FWFT两种工作模式的核心差异。通过对比数据就绪时机、读延迟、控制逻辑和有效深度等关键特性,并结合图像处理、数据包转发等典型应用场景,为FPGA设计者提供了清晰的选择依据和实战配置指南,帮助优化数据流性能与设计效率。

weixin_29219189的博客 254

GOF之原型模式

简介 用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。 角色分析 抽象原型类:规定了具体原型对象必须实现的接口。 具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象。 访问类:使用具体原型类中的 clone() 方法来复制新的对象。 代码实现 //浅克隆 非基本类型属性,仍指向原有属性所指向的对象的内存地址 class User implements Cloneable ...

weixin_41955345的博客 162

手把手教你用DaVinci Configurator配置AUTOSAR SWC接口(含RTE避坑指南)

本文提供了一份基于DaVinci Configurator工具的AUTOSAR软件组件(SWC)接口配置实战指南。文章详细拆解了SR(发送者-接收者)和CS(客户端-服务器)接口的配置流程,并重点分享了运行时环境(RTE)生成阶段在多核部署、数据类型匹配等常见陷阱中的避坑方案与调试技巧,旨在帮助汽车电子工程师高效完成配置并规避错误。

uuu88的博客 547

儿童启蒙教育APP

pinyinList.add(createPinyin("a", "啊,像阿姨的阿", R.raw.pinyin_a));pinyinList.add(createPinyin("i", "衣,像衣服的衣", R.raw.pinyin_i));pinyinList.add(createPinyin("u", "乌,像乌鸦的乌", R.raw.pinyin_u));pinyinList.add(createPinyin("ü", "鱼,像小鱼的鱼", R.raw.pinyin_v));-- 固定竖屏 -->

寒寒豆豆软件公司的博客 167

GOF23 之 原型模式详解

介绍 原型模式是指用原型实例指定创建对象的种类,通过拷贝这些原型创建新的对象。原型模式是一种创建型设计模式,允许一个对象在创建一个可定制对象,无需知道如何创建的细节。 工作原理 通过将一个原型对象传给一个要发动的对象,这个要发动创建的对象通过请求原型对象拷贝他们自己来实施创建,即对象.clone()。 简单理解:影分身之术。 原理结构 说明: Prototype:原型类,声明一个克隆自己的接口 ConcretePrototype:具体的原型类,实现了一个克隆自己的操作。 Client:让一个原型对象克隆自

weixin_45003863的博客 299

100天精通Python(可视化篇)——第89天:Bokeh库绘图可视化基础入门(参数说明+案例实战)

专栏导读 一、Bokeh是什么? 二、安装与导入 三、Bokeh接口介绍 四、创建图表 五、添加自定义渲染器 切换主题 添加图例 图例位置 图例方向 图例背景和边界 图例文本的外观 行列布局 网格布局

努力让自己发光,对的人才能迎着光而来 1万+

GOF23设计模式(创建型模式) 原型模式

一:原型模式的定义 二:关于深克隆和深克隆的区别 三:反序列化的方式实现深克隆 原型模式: 通过new产生一个对象需要非常繁琐的数据准备或访冋权限,则可以使用原型模式。 就是java中的克隆技术,以某个对象为原型,复制出新的对象。显然,新的对象具备原型对象的特点 优势有:效率高(直接克隆,避免了重新执行构造过程步骤). 克隆类似于new,但是不同于new。new创建新的对象属性采用的是默认值。克隆出的对象的属性值完全和原型对象相同。并且克隆出的新对象改变不会影晌原型对象。然后,再修改克隆对..

欢迎来到 Baret-H 的博客 1075

ThingsBoard PE专业版解决方案技术文档——温度&湿度

温湿度解决方案

weixin_67440240的博客 819

请尽可能地详细说明一个VLA项目的立项训练到落地的全流程

一个机器人VLA项目的全流程是一个复杂的系统工程,它深度融合了机器人学 (Robotics)计算机视觉 (CV)和自然语言处理 (NLP)。其核心挑战在于高质量数据的获取和从仿真到现实的有效迁移。与纯粹的软件AI项目相比,它增加了硬件、物理交互和安全性的维度,但其最终能让AI走出虚拟世界、在物理世界中产生实际价值,这也是其巨大的魅力所在。

具身机器人和通用AI 303

GOF——原型模式

在已有对象的基础上,复制该对象的属性. new一个对象需要非常繁琐的数据准备时,使用原型模式,更加快速. /** * 浅复制--修改老对象属性新对象也会变 */ class Person implements Cloneable,Serializable { private String name; private Date age; public Person...

weixin_38358430的博客 271

openssl命令数据摘要详解(SM3、sha256、MD5、dss1、mdc2、ripemd160)

SM3是由中国密码学家设计的密码哈希函数,是中国国家密码管理局(National Cryptographic Authority,简称:CNCA)颁布的国家密码算法标准。SM3属于密码杂凑函数家族,它可以计算任意长度的消息并生成固定长度(256比特,即32字节)的哈希值。SM3生成的哈希值长度为256比特(32字节),不管输入消息的长度如何,输出始终是固定的。SM3将输入数据划分为512比特(64字节)的分组,并对每个分组进行处理。

N阶二进制的博客 4460

java_233_GOF23设计模式_原型模式_prototype_浅复制_深复制_Clonable接口_练习

原型模式prototype

weixin_45339692的博客 168

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

GOF 23 设计模式之 原型模式(prototype) 深复制与浅复制举例

原型模式初探 通过new产生一个对象需要复杂的数据准备或访问权限,可以使用原型模式。 就是Java的克隆技术,以某个对象为原型,复制出新的对象。显然,新的对象具备原型对象的特点 优势有:效率高(直接克隆,避免了重新执行构造函数的过程) 克隆类似于new,但是不同于new。new创建新的对象属性采用的是默认值。克隆出来的对象属性完全与原型对象相同。而且克隆出来的对象的属性值的修改不会影响到原型对象 原

张博的Blog 653

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

GOF23设计模式之原型模式

GOF23设计模式之原型模式 包括原理,浅克隆,深克隆,与new对象方式效率对比,适用场景

开心杨的个人博客 313

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

GOF 设计模式 原型模式 笔记

原型模式 意图:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 在以下情况下可以使用Prototype模式: 当一个系统应该独立于他的产品创建,构成和表示时 当要实例化的类是在运行时指定时,例如,通过动态装载 为了避免创建一个与产品类层次平行的工厂类层次时 当一个类的实例只能有几个不同状态组合的一种时,建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类方便些。 结构 对于应用如果只需要频繁创建几个不同状态的产品时,选择克隆原型可能要比创建新对象效率要高。 但是对于每一种

zjj_daniu的博客 194

GOF23设计模式之原型模式(prototype)

一、原型模式概述   1.通过new产生一个对象需要非常繁琐的数据准备和访问权限,则可以使用原型模式。   2.就是java中的克隆技术,以某个对象为原型,复制出新的对象,显然,新的对象具备原型对象的特点。   3.优势:效率高(直接克隆,避免了重新执行构造函数的过程)。   4.克隆类似于new,但是不同于new。     new创建出来的对象属性采用默认值,克隆出来的对象属...

dcpvpf6917的博客 158

Java GoF 23种设计模式-创建型模式-原型模式(Prototype Pattern)

文章目录一、模式定义二、模式动机三、模式结构四、代码实现五、优缺点5.1 原型模式优点5.2 原型模式缺点 一、模式定义 原型模式(Prototype Pattern)是一种创建型设计模式,使你能够复制已有对象, 而又无需使代码依赖它们所属的类。原型模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用原型模式。 二、模式动机 在我们应用程序可能有某些对象的结构比较复杂,但是我们又需要频繁的使用它们,如果这个时候我们来不断的新建这个对象势必会大大损耗系统内存的,这个时候

WU4566285的博客 373

原型模式 Prototype Pattern

一. 原型模式简介  原型模式(Prototype Pattern)也是一种创建型模式,它关注的是大量相似对象的创建问题。我们经常会遇到这样的情况:在系统中要创建大量的对象,这些对象之间具有几乎完全相同的功能,只是在细节上有一点儿差别。  这样的情形经常遇到。三国系列游戏是我最喜欢的游戏系列之一。你有没有注意到那里边上百位英雄的头像基本上很相似?你仔细区分就会发现,虽然每个人都不同,但基本上只具有

Brookes的专栏 8603

设计模式(五)创建型:原型模式详解

原型模式(Prototype Pattern)是 GoF 23 种设计模式中的创建型模式之一,其核心价值在于通过复制现有对象来创建新对象,而不是通过 new 关键字调用构造函数。

谦与谦寻的神隐 1003

C++设计模式——原型模式

原型模式1.原型模式2.代码实现 1.原型模式 什么是原型模式? 在GOF的《设计模式:可复用面向对象软件的基础》中是这样说的:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。这这个定义中,最重要的一个词是“拷贝”,也就是口头上的复制,而这个拷贝,也就是原型模式的精髓所在。 举一个最简单的例子来说明原型模式:记得上小学的时候,老师把需要做的课外习题写到黑板上,而下面的我们都要把这些题抄写到自己的本子上,回家做好,第二天交上来,也就是每道题,全班50个人,每个人都要抄写一遍。按照现在的时间理论

嵌入式与人工智能 1049

【GOF23设计模式】_原型模式JAVA233-234

一、S03E233_01【GOF23设计模式】_原型模式、prototype、浅复制、深复制、Cloneable接口二、S03E234_01【GOF23设计模式】_原型模式、反序列化实现深复制、效率对比、创建型模式总结

好好学习天天向上 562

233_尚学堂_高淇_java300集最全视频教程_【GOF23设计模式】_原型模式_prototype_浅复制_深复制_反序列化实现深复制

原型模式分为深复制和浅复制 浅复制:只是拷贝对象本身,不拷贝对象的属性,所以”浅“。复制后的对象自然在内存中位于不同的地址中,因为本质上是两个对象,所以内存中的地址自然不同。但是复制之后的对象的属性却与原对象的属性相同,也就是两个对象的属性在内存中位于同一地址,并没有拷贝出另一份。

jingjbuer的专栏 1827

JAVA设计模式(八) -- 原型模式

原型模式属于对象创建模式,GOF 给它的定义为:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 (一)概念梳理 浅复制与深复制概念 1.浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。 2.深复制(深克隆) 被复制对象的所有变量都含有与原来的对象相同的值...

分享技术,共同进步! 205

【GOF23设计模式】原型模式

【GOF23设计模式】原型模式 来源:http://www.bjsxt.com/一、【GOF23设计模式】_原型模式、prototype、浅复制、深复制、Cloneable接口 浅复制 1 package com.test.prototype; 2 3 import java.util.Date; 4 5 /*...

weixin_30954265的博客 90
上一篇: Spring之ApplicationContextAware的作用
下一篇: GoF设计模式(十三) - 策略模式
让程序飞
博客等级 码龄10年 8831粉丝 99原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

让程序飞

您的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值