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

DeepQA: A Unified Transcriptome-Based Aging Clock Using Deep Neural Networks 摘要: 本研究针对转录组衰老时钟存在的关键局限——仅在健康样本训练导致对患病个体预测偏差的问题,提出DeepQA,一种基于专家混合架构与新型Hinge-MAE损失函数的深度学习模型。通过同时利用健康与患病个体的异质数据训练,DeepQA显著提升预测精度:在健康个体上MAE比现有方法低1.5年,且是首个能正确处理五类疾病条件的模型。其创新性体现在: 方法学突破:Hinge-MAE损失函数消除健康/患病样本的训练偏差,专家混合架构高效整合多队列数据; 流程革新:摒弃传统基因预筛选步骤,通过显著图分析直接识别衰老 阅读详情

原型模式初探

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

原型模式的实现

  • Clonable接口和clone方法
  • prototype模式中实现起来最困难的部分就是内存复制操作,所幸Java中提供了clone()方法来帮助我们做了绝大部分事情
  • 注意用词:克隆和拷贝时一样的

开发当中的使用场景

  • 原型模式很少单独出现,一般是和工厂方法模式一起出现,通过clone的方法创建一个对象,然后由工厂方法提供给调用者。
    • spring中bean的创建市级就是两种:单例模式和原型模式

浅复制例子

  • Sheep
package com.coderbean.prototype;

import java.util.Date;

public class Sheep implements Cloneable {
    private String name;
    private Date birthday;

    public Sheep() {
        // TODO Auto-generated constructor stub
    }



    public Sheep(String name, Date birthday) {
        super();
        this.name = name;
        this.birthday = birthday;
    }



    @Override
    protected Object clone() throws CloneNotSupportedException {
        Object obj = super.clone(); //直接调用Object的clone方法
        return obj;


    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
}
  • Client
package com.coderbean.prototype;

import java.util.Date;

/**
 * 测试原型模式(浅克隆)
 * @author Chang
 *
 */
public class Client {
    public static void main(String[] args) throws CloneNotSupportedException {
         Date date = new Date(123456L);
         Sheep s1 = new Sheep("ShaoLi", date);
         System.out.println(s1);

         System.out.println(s1.getName());
         System.out.println(s1.getBirthday());

         Sheep s2 = (Sheep) s1.clone();
         System.out.println(s2);

         date.setTime(999999L);

         System.out.println(s1.getName());
         System.out.println(s1.getBirthday());
         System.out.println(s2.getName()); 
         System.out.println(s2.getBirthday());
    }
}

深复制举例

  • Sheep2
package com.coderbean.prototype;

import java.util.Date;

public class Sheep2 implements Cloneable {
    private String name;
    private Date birthday;

    public Sheep2() {
        // TODO Auto-generated constructor stub
    }



    public Sheep2(String name, Date birthday) {
        super();
        this.name = name;
        this.birthday = birthday;
    }



    @Override
    protected Object clone() throws CloneNotSupportedException {
        Object obj = super.clone(); //直接调用Object的clone方法

        //添加如下代码实现深复制
        Sheep2 s = (Sheep2) obj;
        s.setBirthday((Date)this.birthday.clone());

        return obj;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
}
  • Client2
package com.coderbean.prototype;

import java.util.Date;

/**
 * 测试原型模式(深克隆)
 * @author Chang
 *
 */
public class Client2 {
    public static void main(String[] args) throws CloneNotSupportedException {
        Date date = new Date(123456L);
        Sheep2 s1 = new Sheep2("ShaoLi", date);
         System.out.println(s1);

         System.out.println(s1.getName());
         System.out.println(s1.getBirthday());

         Sheep2 s2 = (Sheep2) s1.clone();
         System.out.println(s2);

         date.setTime(999999L);

         System.out.println(s1.getName());
         System.out.println(s1.getBirthday());
         System.out.println(s2.getName()); 
         System.out.println(s2.getBirthday());
    }
}

利用序列化和反序列化技术实现深克隆

package com.coderbean.prototype;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.util.Date;

/**
 * 测试原型模式(深克隆,使用序列化和反序列化实现)
 * @author Chang
 *
 */
public class Client3 {
    public static void main(String[] args) throws CloneNotSupportedException, ClassNotFoundException, IOException {
        Date date = new Date(123456L);
        Sheep s1 = new Sheep("ShaoLi", date);
         System.out.println(s1);

         System.out.println(s1.getName());
         System.out.println(s1.getBirthday());

         //使用序列化和反序列化实现深复制
         ByteArrayOutputStream bos = new ByteArrayOutputStream();
         ObjectOutputStream oos = new ObjectOutputStream(bos);

         oos.writeObject(s1);
         byte[] bytes = bos.toByteArray();

         //反序列化
         ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
         ObjectInputStream ois = new ObjectInputStream(bis);
         Sheep s2 = (Sheep) ois.readObject();

         date.setTime(1234562342L);


         System.out.println(s1.getName());
         System.out.println(s1.getBirthday());
         System.out.println(s2.getName()); 
         System.out.println(s2.getBirthday());
    }
}
华为OD机试 - 压缩日志查询(Python/JS/C/C++ 双机位C卷 100分) 本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。某设备需要记录每分钟检测到的指标值。为了节约存储空间,将连续相同指标值的记录合并。压缩之前:202411231000,11 202411231001,11 202411231002,12 202411231003,12 202411231004, 阅读详情

相关推荐

Unity新手必看:5分钟搞定TextMeshPro中文乱码,告别小方块(附7000+常用字库)

本文详细介绍了Unity中TextMeshPro中文乱码问题的解决方案,包括快速生成中文字体的步骤和优化技巧。通过使用支持中文的.ttf字体文件和自定义字符集,开发者可以在5分钟内解决TMP显示小方块的问题,提升游戏或应用的文本显示效果。

weixin_33095355的博客 362

设计模式GOF23——开篇

设计模式的类型和原则

buyoufa的博客 414

【Unity3D】RTS Engine 笔记一

RTS Engine 中配置一个新场景, 初步认识GameManager、设置地形以及配置地形网格搜索

ViYeye的博客 1648

GOF23之原型模式Demo

原型模式是指用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象,主要用于对象的复制,它的核心是就是类图中的原型类Prototype。Prototype类需要具备以下两个条件: 实现Cloneable接口、重写Object类中的clone方法。 原型模式是一种比较简单的模式,也非常容易理解,实现一个接口,重写一个方法即完成了原型模式。在实际应用中,原型模式很少单独出现。经常与其他模式混用

gujianoneyan的博客 451

Anaconda安装教程傻瓜教程

网上好多教程找的我心好累,为了方便新手安装,我这边整理了大致详细的教程,参考了好几个大佬的教程,废话不多说,直接开始~ **前言:**有人纠结先安装python还是安装anaconda,这边的建议是装anaconda,就不需要单独装python了。 其次,有小伙伴的Anaconda的安装分两种情况: 情况一:电脑现在没有装python或者现在装的可以卸载掉(装Anaconda时先卸python); 情况二:电脑目前装了python,但想保留它;

zlc2351951436的博客 5万+

对比学习(contrastive learning)

什么是自监督学习? 举个通俗的例子:即使不记得物体究竟是什么样子,我们也可以在野外识别物体。 我们通过记住高阶特征并忽略微观层面的细节来做到这一点。那么,现在的问题是,我们能否构建不关注像素级细节,只编码足以区分不同对象的高阶特征的表示学习算法?通过对比学习,研究人员正试图解决这个问题。 什么是对比学习? 对比学习是一种自监督学习方法,用于在没有标签的情况下,通过让模型学习哪些数据点相似或不同来学习数据集的一般特征。 让我们从一个简单的例子开始。想象一下,你是一个试图理解世界的新生婴儿。在家里,假设你有两只

cziun的博客 11万+

GoF的23个经典设计模式

以文本和思维导图的方式简明扼要的介绍了GoF的23个经典设计模式,可当成学习设计模式的一个小手册,偶尔看一下,说不定会对大师的思想精髓有新的领悟。 GoF(“四人帮”,又称Gang of Four,即Erich Gamma, Richard Helm, Ralph Johnson & John Vlissides) 创建型模式(5个):单例模式、原型模式、建造者模式、工厂模式、...

weixin_30270561的博客 971

华为OD机试 - 文件存储系统的排序 - 深度优先搜索dfs(Java 双机位C卷 200分)

华为OD机试 双机位C卷题库疯狂收录中,刷题。

学Java,找哪吒 719

设计模式学习--原型模式(深复制与浅复制)

原型模式,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。   原型模式就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。   其实,原型模式就是在原有的类中增加一个克隆函数,克隆一个和自身一样的对象。这其中就涉及到了深复制和浅复制,浅复制:被复制的对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。深复制:把引

hjf161105的博客 462

Response Instance 详解:在 ABAP OData Client Proxy 中读懂每一次响应

ABAP OData Client Proxy中的Response Instance是关键信息载体,封装了业务数据及调用上下文(如分页、delta link等)。响应实例在执行请求后自动生成,根据请求类型返回特定接口(如READ返回/IWBEP/IF_CP_RESPONSE_READ)。响应抽象与OData版本解耦,支持统一处理V2/V4服务。常见响应类型包括单实体读取、列表读取(支持分页和增量同步)、创建/更新/删除响应等。开发时可通过响应对象的安全类型方法获取数据,如get_business_data获

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 136

CLRNet车道线检测模型在Orin Nano Super开发板上的全栈部署与优化实践

本文详细介绍了将CLRNet车道线检测模型部署到NVIDIA Orin Nano Super开发板的全过程。内容包括:1) Orin开发板硬件规格分析;2) JetPack SDK环境配置与Python虚拟环境搭建;3) CLRNet模型架构解析与PyTorch实现;4) 模型转换与TensorRT加速优化方法。通过系统性的环境配置、模型转换和性能优化,为边缘计算场景下的车道线检测应用提供了完整的解决方案,实现了在Orin平台上的高效部署。

huanghm88的专栏 226

GOF23 之 原型模式详解

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

weixin_45003863的博客 299

npm报错 npm WARN deprecated....的问题解决方式

报错 :npm WARN deprecated … 现象:无法进行有效的vue项目的部署以及npm install 命令的执行。 原因一:版本问题 说明:由于npm的版本过低或者过高导致的报错 检查版本: npm -v 如果版本是比较旧的,或者是最新的,这里可以进行对npm的更新和回退。 更新npm版本: npm updated -d 查看可以更新的版本 npm install -g npm 默认安装最新版本 安装回退指定的版本: npm updated -d 查看所有的版本 npm -g i.

任聪聪的博客 16万+

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

原型模式prototype

weixin_45339692的博客 168

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

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

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

dcpvpf6917的博客 158

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

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

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

WU4566285的博客 373

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

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

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

jingjbuer的专栏 1827

IOS设计模式浅析之原型模式(Prototype)--copy

IOS设计模式浅析之原型模式(Prototype) 原型模式的定义                                                                                           “使用原型实例指定创建对象的种类,并通过复制这个原型创建新的对象”。最初的定义出现于《设计模式》(Addison-Wesley,1994)。   

dlm_211314的专栏 582

原型模式

 引用:http://dev.firnow.com/course/3_program/gcs/2008623/127731.html原型模式和拷贝构造函数区别。原型模式里,你可以保存基类指针,最后生成的是这个指针真正指向的子类,而拷贝构造函数你必须搞一个具体的类进去,生成的object也是固定的。 Prototype模式也叫原型模式,是由GoF提出的23种设计模式中的一种。Prototype模式是一种对象创建型模式,它采取复制原型对象的方法来创建对象的实例。使用Prototype模式创建的实例,具有与原型一

xinpo66的专栏 1028

JAVA SCRIPT设计模式--创建型设计模式之原型模式(4)

我们可以为每一种音乐对象创建一个GraphicTool的子类,但这样会产生大量的子类,这些子类仅仅在它们所初始化的音乐对象的类别上有所不同。解决办法是让GraphicTool通过拷贝或者“克隆”一个Graphic子类的实例来创建新的Graphic,我们称这个实例为一个原型。比如你想构建一个拥有通用架构的音乐编辑器 ,该编辑器架构可以图形编辑,也可以增加一些表示音符、休止符和五线谱的新对象。此外,为定义选择板中的那些工具,还提供一个。从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。

火柴盒 389

GOF23种设计模式精解

创建型 1. Factory Method(工厂方法) 2. Abstract Factory(抽象工厂) 3. Builder(建造者) 4. Prototype(原型) 5. Singleton(单例) 结构型 6. Adapter Class/Object(适配器) 7. Bridge(桥接) 8. Composite(组合) 9. Decorator(装饰)

zhangcanyan的博客 2万+

人间万象“23式” —— GOF 23种设计模式

创建型模式    1、FACTORY    2、BUILDER    3、FACTORY METHOD    4、PROTOTYPE    5、SINGLETON结构型模式    6、ADAPTER    7、BRIDGE    8、COMPOSITE    9、DECORATOR    10、FAÇADE    11、FLYWEIGHT    12

oic的专栏 1541

使用Sublime Text 3 编译并运行Java程序

问题? 安装好把SublimeText当作一个轻量级的编译工具来用还是不错的,可是当我下载好并且写了一个HelloWord的Java程序之后,它居然只编译不运行!那么我们几天就来解决这个问题 注意:本教程针对的是Windows平台,Mac OS我已经试过了,并不行。 变化 原本网上是有一些关于sublime text 2的教程的,可是Sublime Text 3 和2 有些区别,主要是原来的一些配置

张博的Blog 3万+

Java实现哲学家就餐问题

什么是哲学家就餐问题? 可以参考百度百科 或者维基百科维基百科 我给出一种方法的实现 Chandy/Misra解法 1984年,K. Mani Chandy和J. Misra提出了哲学家就餐问题的另一个解法,允许任意的用户(编号P1, …, Pn)争用任意数量的资源。与资源分级解法不同的是,这里编号可以是任意的。 把筷子凑成对,让要吃的人先吃,没筷子的人得到一张换

张博的Blog 3730

JDBC(Java Database Connection) 教程

什么是JDBC? JDBC为java开发者使用数据库提供了统一的编程接口,它由一组java类和接口组成。是java程序与数据库系统通信的标准API。JDBC API使得开发人员可以使用纯java的方式来连接数据库,并执行操作。 sun公司由于不知道各个主流商用数据库的程序代码,因此无法自己写代码连接各个数据库,因此,sun公司决定,自己提供一套API,凡事数据库想与java进行连接的,数据库厂

张博的Blog 3512

JVM核心之 JVM运行和类加载全过程

JVM核心之 JVM运行和类加载全过程为什么要研究类加载的全过程 有助于了解JVM运行过程 更深入了解java动态性,(解热部署、动态加载),提高程序员的灵活性 类加载的全过程 类加载机制 JVM可以把class文件加载到内存,并对数据进行校验、解析和初始化,最终形成JVM可以直接使用的Java类型的过程 Created with Raphaël 2.1.0加载Loading验证Verificat

张博的Blog 1844
上一篇: GOF23设计模式之 建造者模式
下一篇: 创建型模式总结:都是来帮助我们创建对象的!
coderbean
博客等级 码龄11年 12粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值