设计模式(6)原型模式

一、介绍

Java中自带的原型模式是clone()方法。该方法是Object的方法,native类型。他的作用就是将对象的在内存的那一块内存数据一字不差地再复制一个。我们写简单类的时候只需要实现Cloneable接口,然后调用Object::clone方法就可实现克隆功能。这样实现的方式是浅拷贝。

 1、深复制与浅复制:

(1)浅复制:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象;

//原型类
public class Resume implements Cloneable,Serializable{private static final long serialVersionUID = 1L;private String name;private String sex;private String age;Resume(String name,String sex,String age){this.name=name;this.sex=sex;this.age=age;}/*** 设置个人信息* @param sex* @param age*/public void setPersonInfo(String sex,String age){this.sex=sex;this.age=age;}//描述public void dispaly(){System.out.println("姓名:"+name+"\t年龄:"+age+"\t性别:"+sex);}public Object clone(){try {Resume resume = (Resume)super.clone();return resume;}catch (Exception e){return null;}}}

  客户端:

public class MainTest {public static void main(String[] args){Resume resume = new Resume("大鸟","男","25");Resume resume2 = (Resume)resume.clone();resume2.setPersonInfo("男","26");resume.dispaly();resume2.dispaly();}
}

 (2)深复制:把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。

      新增对象类

public class WorkExperience implements Cloneable{private String workDate;private String company;public WorkExperience(String workDate,String company){this.workDate=workDate;this.company=company;}public WorkExperience(){}/**省略set、get方法*/public Object clone(){try {return super.clone();}catch (Exception e){return null;}}}
public class Resume implements Cloneable,Serializable{private static final long serialVersionUID = 1L;private String name;private String sex;private String age;private WorkExperience workExperience;Resume(String name,String sex,String age){this.name=name;this.sex=sex;this.age=age;this.workExperience=new WorkExperience();}/*** 添加私有构造 克隆工作经历* @param workExperience*/private Resume(WorkExperience workExperience){this.workExperience= (WorkExperience) workExperience.clone();}/*** 设置个人信息* @param sex* @param age*/public void setPersonInfo(String sex,String age){this.sex=sex;this.age=age;}/*** 设置工作经历* @param workDate* @param company*/public void setWorkExperience(String workDate, String company){this.workExperience.setWorkDate(workDate);this.workExperience.setCompany(company);}//描述public void dispaly(){System.out.println("姓名:"+name+"\t年龄:"+age+"\t性别:"+sex);System.out.println("工作经历:"+workExperience.getWorkDate()+"\t"+workExperience.getCompany());}/*** 重写了克隆方法* @return*/public Object clone(){try {Resume resume = new Resume(this.workExperience);//调用私有构造器实现工作经历克隆//给对象属性重新赋值--最终返回的是深复制的resume对象resume.name=this.name;resume.sex=this.sex;resume.age=this.age;return resume;}catch (Exception e){return null;}}}

 客户端

public class MainTest {public static void main(String[] args){Resume resume = new Resume("大鸟","男","25");resume.setWorkExperience("2015-2016","南京工作");Resume resume2 = (Resume)resume.clone();resume2.setPersonInfo("男","26");resume2.setWorkExperience("2016-2018","上海工作");resume.dispaly();resume2.dispaly();}
}

二、应用:

1、数据集对象DataSet,有Clone()方法和Copy()方法,Clone用于复制结构而不复制数据,实现了原型模式的浅复制;Copy不但复制结构也复制数据,实现了原型模式的深复制。

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

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

相关文章

[oneAPI] 图像分类CIFAR-10

[oneAPI] 图像分类CIFAR-10 图像分类参数与包加载数据模型训练过程结果 oneAPI 比赛:https://marketing.csdn.net/p/f3e44fbfe46c465f4d9d6c23e38e0517 Intel DevCloud for oneAPI:https://devcloud.intel.com/oneapi/get_started/aiAnalyticsToolkitSam…

解决内网GitLab 社区版 15.11.13项目拉取失败

问题描述 GitLab 社区版 发布不久,搭建在内网拉取项目报错,可能提示 unable to access https://github.comxxxxxxxxxxx: Failed to connect to xxxxxxxxxxxxxGit clone error - Invalid argument error:14077438:SSL routines:SSL23_GET_S 15.11.13ht…

【学会动态规划】乘积为正数的最长子数组长度(21)

目录 动态规划怎么学? 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后: 动态规划怎么学? 学习一个算法没有捷径,更何况是学习动态规划, 跟我…

《系统架构设计师教程》重点章节思维导图

内容来自《系统架构设计师教程》,筛选系统架构设计师考试中分值重点分布的章节,根据章节的内容整理出相关思维导图。 重点章节 第2章:计算机系统知识第5章:软件工程基础知识第7章:系统架构设计基础知识第8章&#xff1…

常见程序搜索关键字转码

个别搜索类的网站因为用户恶意搜索出现误拦截情况,这类网站本身没有非法信息,只是因为把搜索关键字显示在网页中(如下图),可以参考下面方法对输出的关键字进行转码 DEDECMS程序 本文针对Dedecms程序进行搜索转码&…

XXL-JOB任务调度平台的安装使用教程

首先从GitHub上面将项目clone下来。 GitHub地址:https://gitee.com/xuxueli0323/xxl-job.git 下载好之后,然后通过IDEA打开,将Maven编译好后项目结构如下 在数据库中运行这个SQL文件 ,将基础表创建出来。就可以得到左边图中那些表…

复合 类型

字符串和切片 切片 切片的作用是允许你引用集合中部分连续的元素序列,而不是引用整个集合。 例如: let s String::from("hello world");let hello &s[0..5]; // 切片 [0,5) 等效于&s[..5] let world &s[6..11]; // 切片…

电脑缺失msvcp140.dll怎么办?解决msvcp140.dll缺失问题

msvcp140.dll是Microsoft Visual C Redistributable中的一个动态链接库文件,用于提供运行时支持。它的主要作用是为应用程序提供必要的函数和组件,以便在运行时执行特定的任务。当系统中缺少msvcp140.dll文件时,我们打开游戏或许软件时候就会…

Wordcloud | 风中有朵雨做的‘词云‘哦!~

1写在前面 今天可算把key搞好了,不得不说🏥里手握生杀大权的人,都在自己的能力范围内尽可能的难为你。😂 我等小大夫也是很无奈,毕竟奔波霸、霸波奔是要去抓唐僧的。 🤐 好吧,今天是词云&#x…

使用selenium如何实现自动登录

回顾使用requests如何实现自动登录一文中,提到好多网站在我们登录过后,在之后的某段时间内访问该网页时,不会给出请登录的提示,时间到期后就会提示请登录!这样在使用爬虫访问网页时还要登录,打乱我们的节奏…

【BASH】回顾与知识点梳理(二十七)

【BASH】回顾与知识点梳理 二十七 二十七. 磁盘配额(Quota)27.1 磁盘配额 (Quota) 的应用与实作什么是 QuotaQuota 的一般用途Quota 的使用限制Quota 的规范设定项目 27.2 一个 XFS 文件系统的 Quota 实作范例实作 Quota 流程:设定账号实作 Quota 流程-1&#xff1a…

Python random模块用法整理

随机数在计算机科学领域扮演着重要的角色,用于模拟真实世界的随机性、数据生成、密码学等多个领域。Python 中的 random 模块提供了丰富的随机数生成功能,本文整理了 random 模块的使用。 文章目录 Python random 模块注意事项Python random 模块的内置…

用AI攻克“智能文字识别创新赛题”,这场大学生竞赛掀起了什么风潮?

文章目录 一、前言1.1 大赛介绍1.2 项目背景 二、基于智能文字场景个人财务管理创新应用2.1 作品方向2.2 票据识别模型2.2.1 文本卷积神经网络TextCNN2.2.2 Bert 预训练微调2.2.3 模型对比2.2.4 效果展示 2.3 票据文字识别接口 三、未来展望 一、前言 1.1 大赛介绍 中国大学生…

时序预测-Informer简介

文章目录 Informer介绍1. Transformer存在的问题2. Informer研究背景3. Informer 整体架构3.1 ProbSparse Self-attention3.2 Self-attention Distilling3.3 Generative Style Decoder 4. Informer的实验性能5. 相关资料 Informer介绍 1. Transformer存在的问题 Informer实质…

网络套接字

网络套接字 文章目录 网络套接字认识端口号初识TCP协议初识UDP协议网络字节序 socket编程接口socket创建socket文件描述符bind绑定端口号sockaddr结构体netstat -nuap:查看服务器网络信息 代码编译运行展示 实现简单UDP服务器开发 认识端口号 端口号(port)是传输层协…

【Linux】ICMP协议——网络层

ICMP协议 ICMP(Internet Control Message Protoco)Internet控制报文协议,用于在IP主机、路由器之间传递控制信息,是一个TCP/IP协议。该协议是用来检测网络传输的问题,相当于维修人员的工具。 ICMP协议的定位 在TCP/IP…

Aspera替代方案:探索这些安全且可靠的文件传输工具

科技的发展日新月异,文件的传输方式也在不断地更新换代。传统的邮件附件、FTP等方式已经难以满足人们对于传输速度和安全性的需求了。近年来,一些新兴的文件传输工具受到了人们的关注,其中除了知名的Aspera之外,还有许多可靠安全的…

简绘ChatGPT支持Midjourney绘图 支持stable diffusion绘图

简绘支持Midjourney绘图和stable diffusion绘图。 这意味着简绘具备Midjourney绘图和stable diffusion绘图功能的支持。

CSS自学框架之表单

首先我们看一下表单样式,下面共有5张截图 一、CSS代码 /*表单*/fieldset{border: none;margin-bottom: 2em;}fieldset > *{ margin-bottom: 1em }fieldset:last-child{ margin-bottom: 0 }fieldset legend{ margin: 0 0 1em }/* legend标签是CSS中用于定义…

《qt quick核心编程》笔记四

11 Model/View Delegate实际上可以看成是Item的一个模板 11.1 ListView ListView用于显示一个条目列表,数据来自于Model,每个条目的外观来自于Delegate 要使用ListView必须指定一个Model、一个Delegate Model可以是QML内建类型,如ListModel…