设计模式(5):原型模式
一.原型模式
- 通过 n e w 产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。 \color{red}{通过new产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。} 通过new产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。
- 就是java中的克隆技术,以某个对象为原型,复杂出新的对象。显然,新的对象具备原型对象的特点。
- 优势: 效率高(直接克隆,避免了重新执行构造过程步骤)。
- 克隆类似new,但是不同于new。new创建新的对象属性采用的是默认值。克隆出的对象的属性值完全和原型对象相同。并且克隆出的新对象改变不会影响原型对象。然后,再改变克隆对象的值。
- 原型模式一般很少单独出现,一般是和工厂方法模式一起出现,通过 c l o n e 方法创建一个对象,然后由工厂方法提供给调用者。 \color{red}{原型模式一般很少单独出现,一般是和工厂方法模式一起出现,通过clone方法创建一个对象,然后由工厂方法提供给调用者。} 原型模式一般很少单独出现,一般是和工厂方法模式一起出现,通过clone方法创建一个对象,然后由工厂方法提供给调用者。
二.原型模式实现
- cloneable接口和clone方法;
- 利用序列化和反序列化实现深克隆。
三.浅克隆和深克隆
- 所谓浅克隆、深克隆指的是:克隆对象和原型对象属性对象引用是否同一个,是同一个就是浅克隆,否则就是深克隆。
四.代码展示
/*** 克隆羊 多利 对象*/
public class Sheep implements Cloneable{private String name;private Date birthday;@Overrideprotected Object clone() throws CloneNotSupportedException {//ֱ直接调用Object对象的clone()方法Object obj=super.clone(); return obj;}public Sheep() {}public Sheep(String name, Date birthday) {this.name = name;this.birthday = birthday;}public String getName() {return name;}public Date getBirthday() {return birthday;}public void setName(String name) {this.name = name;}public void setBirthday(Date birthday) {this.birthday = birthday;}
}
/*** 原型模式------>浅复制(浅克隆)*/
public class App {public static void main(String[] args) throws CloneNotSupportedException {Date date=new Date(123123123L);Sheep s1=new Sheep("多利",date);Sheep s2=(Sheep) s1.clone();System.out.println(s1+"\t"+s1.getName()+"---->"+s1.getBirthday());//这里更改后 s2 克隆也相应更改date.setTime(321213543123L);System.out.println(s1+"\t"+s1.getName()+"---->"+s1.getBirthday());//可以更改s2的属性s2.setName("多多利");System.out.println(s2+"\t"+s2.getName()+"---->"+s2.getBirthday());}
}
com.reyco.prototype.Sheep@7852e922 多利---->Fri Jan 02 18:12:03 CST 1970
com.reyco.prototype.Sheep@7852e922 多利---->Fri Mar 07 01:59:03 CST 1980
com.reyco.prototype.Sheep@55f96302 多多利---->Fri Mar 07 01:59:03 CST 1980
/*** 原型模式------>深复制(深克隆)*/
public class Sheep2 implements Cloneable{private String name;private Date birthday; @Overrideprotected Object clone() throws CloneNotSupportedException {Object obj=super.clone(); //直接调用Object对象的clone()方法 //添加以下代码实现深复制Sheep2 s=(Sheep2) obj; s.birthday=(Date) this.birthday.clone(); return obj;}public Sheep2() {}public Sheep2(String name, Date birthday) {this.name = name;this.birthday = birthday;}public String getName() {return name;}public Date getBirthday() {return birthday;}public void setName(String name) {this.name = name;}public void setBirthday(Date birthday) {this.birthday = birthday;}
}
/*** 原型模式------>深复制(深克隆)* @author Administrator*/
public class App2 {public static void main(String[] args) throws CloneNotSupportedException {Date date=new Date(123123123L);Sheep2 s=new Sheep2("多利",date);Sheep2 s2=(Sheep2) s.clone();System.out.println(s.getName()+"---->"+s.getBirthday());//这里更改后 s2克隆不会更改date.setTime(321213543123L);System.out.println(s.getName()+"---->"+s.getBirthday());//可以更改s2的属性s2.setName("多多利");System.out.println(s2.getName()+"---->"+s2.getBirthday());}
}
多利---->Fri Jan 02 18:12:03 CST 1970
多利---->Fri Mar 07 01:59:03 CST 1980
多多利---->Fri Jan 02 18:12:03 CST 1970
五.序列化和反序列化实现深克隆
/*** 序列化和反序列化实现深克隆必须实现Serializable接口*/
public class Sheep implements Serializable{private String name;private Date birthday;public Sheep() {}public Sheep(String name, Date birthday) {this.name = name;this.birthday = birthday;}public String getName() {return name;}public Date getBirthday() {return birthday;}public void setName(String name) {this.name = name;}public void setBirthday(Date birthday) {this.birthday = birthday;}
}public static void main(String[] args) throws Exception {Date date=new Date(123123123L);Sheep s=new Sheep("多利",date);System.out.println(s.getName()+"---->"+s.getBirthday());//使用序列化和反序列化实现深复制ByteArrayOutputStream bos=new ByteArrayOutputStream();ObjectOutputStream oos=new ObjectOutputStream(bos);oos.writeObject(s);byte[] bytes =bos.toByteArray(); ByteArrayInputStream bis=new ByteArrayInputStream(bytes);ObjectInputStream ois=new ObjectInputStream(bis);Sheep s2=(Sheep) ois.readObject();//这里更改后 s2克隆不会更改date.setTime(321213543123L);System.out.println(s.getName()+"---->"+s.getBirthday());//可以更改s2的属性s2.setName("多多利");System.out.println(s2.getName()+"---->"+s2.getBirthday());
}
更多设计模式学习:
设计模式(1):介绍
设计模式(2):单例模式
设计模式(3):工厂模式
设计模式(4):建造者模式
设计模式(6):桥接模式
设计模式(7):装饰器模式
设计模式持续更新中…
相关文章:
设计模式(5):原型模式
一.原型模式 通过 n e w 产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。 \color{red}{通过new产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。} 通过new产生一个对象需要非常繁琐的数据准备或访问权限…...
【React】vite + react 项目,进行配置 eslint
安装与配置 eslint 1 安装 eslint babel/eslint-parser2 初始化配置 eslint3 安装 vite-plugin-eslint4 配置 vite.config.js 文件5 修改 eslint 默认配置 1 安装 eslint babel/eslint-parser npm i -D eslint babel/eslint-parser2 初始化配置 eslint npx eslint --init相关…...
Windows入侵排查
目录 0x00 前言 0x01 入侵排查思路 1.1 检查系统账号安全 1.2 检查异常端口、进程 1.3 检查启动项、计划任务、服务 0x00 前言 当企业发生黑客入侵、系统崩溃或其它影响业务正常运行的安全事件时,急需第一时间进行处理,使企业的网络信息系统在最短时…...
C语言每日一题
1.题目 二.分析 本题有两点需要注意的: do-while循环 :在判断while条件前先执行一次do循环static变量 :程序再次调用时static变量的值不会重新初始化,而是在上一次退出时的基础上继续执行。for( i 1; i < 3; i )将调用两次…...
TheMoon 恶意软件短时间感染 6,000 台华硕路由器以获取代理服务
文章目录 针对华硕路由器Faceless代理服务预防措施 一种名为"TheMoon"的新变种恶意软件僵尸网络已经被发现正在侵入全球88个国家数千台过时的小型办公室与家庭办公室(SOHO)路由器以及物联网设备。 "TheMoon"与“Faceless”代理服务有关联,该服务…...
人脸68关键点与K210疲劳检测
目录 人脸68关键点检测 检测闭眼睁眼 双眼关键点检测 计算眼睛的闭合程度: 原理: 设置阈值进行判断 实时监测和更新 拓展:通过判断上下眼皮重合程度去判断是否闭眼 检测嘴巴是否闭合 提取嘴唇上下轮廓的关键点 计算嘴唇上下轮廓关键点之间的距…...
【跟着GPT4学JAVA】异常篇
JAVA异常中的知识点 问: 介绍下JAVA中的异常有哪些知识点吧 答: Java中的异常处理是一个重要的知识点,主要包括以下内容: 异常体系:Java的异常类是Throwable类派生出来的,Throwable下有两个重要的子类:Err…...
Ubuntu上安装d4rl数据集
Ubuntu上安装d4rl数据集 D4RL的官方 github: https://github.com/Farama-Foundation/D4RL 一、安装Mujoco 1.1 官网下载mujoco210文件 如果装过可以跳过这步 链接:https://github.com/deepmind/mujoco/releases/tag/2.1.0 下载第一个文件即可。我这里是在windo…...
C++之STL整理(4)之set 用法(创建、赋值、增删查改)详解
C之STL整理(4)之set 用法(创建、赋值、增删查改)详解 注:整理一些突然学到的C知识,随时mark一下 例如:忘记的关键字用法,新关键字,新数据结构 C 的map用法整理 C之STL整理…...
IDEA MyBatisCodeHelper Pro最新版(持续更新)
目录 0. 你想要的0.1 包下载0.2 使用jh 1. 功能介绍2. 下载安装2.1 在idea中插件市场安装2.2 在jetbrains插件市场下载安装 3. 简单使用3.1 创建一个SpringBoot项目3.2 配置数据库3.3 一键生成实体类、mapper 0. 你想要的 0.1 包下载 测试系统:Windows(…...
sheng的学习笔记-AI-YOLO算法,目标检测
AI目录:sheng的学习笔记-AI目录-CSDN博客 目录 目标定位(Object localization) 定义 原理图 具体做法: 输出向量 图片中没有检测对象的样例 损失函数 编辑 特征点检测(Landmark detection) 定义&a…...
C# wpf 嵌入wpf控件
WPF Hwnd窗口互操作系列 第一章 嵌入Hwnd窗口 第二章 嵌入WinForm控件 第三章 嵌入WPF控件(本章) 第四章 底部嵌入HwndHost 文章目录 WPF Hwnd窗口互操作系列前言一、如何实现?1、继承HwndHost2、添加Content属性3、创建wpf窗口并设置Conten…...
云原生(六)、CICD - Jenkins快速入门
Jenkuns快速入门 一、CICD概述 CICD是持续集成(Continuous Integration)和持续部署(Continuous Deployment)的缩写。它是软件开发中的一种流程和方法论,旨在通过自动化的方式频繁地将代码集成到共享存储库中…...
基于java+springboot+vue实现的付费自习室管理系统(文末源码+Lw+ppt)23-400
摘 要 付费自习室管理系统采用B/S架构,数据库是MySQL。网站的搭建与开发采用了先进的java进行编写,使用了springboot框架。该系统从两个对象:由管理员和用户来对系统进行设计构建。主要功能包括:个人信息修改,对用户…...
【JavaParser笔记02】JavaParser解析Java源代码中的类字段信息(javadoc注释、字段名称)
这篇文章,主要介绍如何使用JavaParser解析Java源代码中的类字段信息(javadoc注释、字段名称)。 目录 一、JavaParser依赖库 1.1、引入依赖 1.2、获取类成员信息 (1)案例代码 <...
Spring IoCDI(3)
DI详解 接下来学习一下依赖注入DI的细节. 依赖注入是一个过程, 是指IoC容器在创建Bean时, 去提供运行时所依赖的资源, 而资源指的就是对象. 在之前的案例中, 使用了Autowired这个注解, 完成了依赖注入这个操作. 简单来说, 就是把对象取出来放到某个类的属性中. 在一些文章中…...
保研线性代数机器学习基础复习1
1.什么是代数(algebra)? 为了形式化一个概念,构建出有关这个概念的符号以及操作符号的公式。 2.什么是线性代数(linear algebra)? 一项关于向量以及操作向量的公式的研究。 3.举一些向量的例子&#x…...
js绑定事件的方法
在JavaScript中,绑定事件的方法主要有以下几种: HTML属性方式:直接在HTML元素中使用事件属性来绑定事件。 html<button onclick"alert(Hello World!)">Click Me</button> DOM属性方式:通过JavaScript代码…...
是德科技keysight N9000B 信号分析仪
181/2461/8938产品概述: 工程的内涵就是将各种创意有机地联系起来,并解决遇到的问题。 CXA 信号分析仪具有出色的实际性能,它是一款出类拔萃、经济高效的基本信号表征工具。 它的功能十分强大,为一般用途和教育行业的用户执行测试…...
软考 - 系统架构设计师 - 架构风格
软件架构风格是指描述特定软件系统组织方式的惯用模式。组织方式描述了系统的组成构件,以及这些构件的组织方式,惯用模式指众多系统所共有的结构和语义。 目录 架构风格 数据流风格 批处理架构风格 管道 - 过滤器架构风格 调用 / 返回风格 主程序…...
CleanMyMac X2024专业免费的国产Mac笔记本清理软件
非常高兴有机会向大家介绍CleanMyMac X 2024这款专业的Mac清理软件。它以其强大的清理能力、系统优化效果、出色的用户体验以及高度的安全性,在Mac清理软件市场中独树一帜。 CleanMyMac X2024全新版下载如下: https://wm.makeding.com/iclk/?zoneid49983 一、主要…...
ES6 模块化操作
ES6模块化主要有两个操作:import 和 export 如果在html文件的script中引用模块的话,要设置<script type"module"> 一种导入导出方法: a.js//分别暴露 export let num 1 export function compute(a, b){return a b }//统…...
统计XML文件内标签的种类和其数量及将xml格式转换为yolov5所需的txt格式
1、统计XML文件内标签的种类和其数量 对于自己标注的数据集,需在标注完成后需要对标注好的XML文件校验,下面是代码,只需将SrcDir换成需要统计的xml的文件夹即可。 import os from tqdm import tqdm import xml.dom.minidomdef ReadXml(File…...
《操作系统导论》第14章读书笔记:插叙:内存操作API
《操作系统导论》第14章读书笔记:插叙:内存操作API —— 杭州 2024-03-30 夜 文章目录 《操作系统导论》第14章读书笔记:插叙:内存操作API1.内存类型1.1.栈内存:它的申请和释放操作是编译器来隐式管理的,所…...
HAProxy + Vitess负载均衡
一、环境搭建 Vitess环境搭建: 具体vitess安装不再赘述,主要是需要启动3个vtgate(官方推荐vtgate和vtablet数量一致) 操作: 在vitess/examples/common/scripts目录中,修改vtgate-up.sh文件,…...
2024年京东云主机租用价格_京东云服务器优惠价格表
2024年京东云服务器优惠价格表,轻量云主机优惠价格5.8元1个月、轻量云主机2C2G3M价格50元一年、196元三年,2C4G5M轻量云主机165元一年,4核8G5M云主机880元一年,游戏联机服务器4C16G配置26元1个月、4C32G价格65元1个月、8核32G费用…...
qt-C++笔记之QSpinBox控件
qt-C笔记之QSpinBox控件 code review! 文章目录 qt-C笔记之QSpinBox控件1.运行2.main.cpp3.main.pro4.《Qt6 C开发指南》:4.4 QSpinBox 和QDoubleSpinBox 1.运行 2.main.cpp #include <QApplication> #include <QSpinBox> #include <QPushButton&g…...
Linux(CentOS)/Windows-C++ 云备份项目(服务器网络通信模块,业务处理模块设计,断点续传设计)
此模块将网络通信模块和业务处理模块进行了合并 网络通信通过httplib库搭建完成业务处理: 文件上传请求:备份客户端上传的文件,响应上传成功客户端列表请求:客户端请求备份文件的请求页面,服务器响应文件下载请求&…...
【QQ版】QQ群短剧机器人源码 全网短剧机器人插件
内容目录 一、详细介绍二、效果展示2.效果图展示 三、学习资料下载 一、详细介绍 QQ版本可以兼容两个框架(HTQQ,MYQQ这两个的vip版也可以使用) 支持私聊与群聊,命令是 搜剧影视关键词 如果无法搜索到影视资源,请使用下方命令&…...
矩阵间关系的建立
参考文献 2-D Compressive Sensing-Based Visually Secure Multilevel Image Encryption Scheme 加密整体流程如下: 我们关注左上角这一部分: 如何在两个图像之间构建关系,当然是借助第3个矩阵。 A. Establish Relationships Between Different Images 简单说明如下: …...
用html做个人网站代码/手机做网页的软件
题目 477. 汉明距离总和 - 力扣(LeetCode) (leetcode-cn.com) 思路 最直接的算法是遍历所有的数字组合并将每组数字的汉明距离求和,然而其时间复杂度为O(n2)O(n^2)O(n2),会超时。 我们考虑通过分治的方法来求解。首先考虑我们以…...
广东南方通信建设有限公司官方网站/做网站平台需要多少钱
近年来数据库技术与其他技术互相结合、相互渗透,出现了许多新的技术和成果,这为数据库技术更加广泛的应用奠定了基础。本章简要介绍分布式数据库、并行数据库、云计算数据库及 XML 数据库架构。 13.1分布式数据库 13.1.1分布…...
php网站开发计划/哪些浏览器可以看禁止访问的网站
在手机连电脑的过程中,出现报错Error:远程主机强迫关闭了一个现有的连接。 解决方案:进入到 Windows cmd 输入命令 : adb 默认绑定的端口 5037.查看占用5037端口的PID xxxx 命令 :netstat -ano ,打开任务管理器&a…...
东莞做网站/seo网上培训课程
Qunit是一个用于JavaScript单元测试的框架。如果你想使用Qunit启动测试,你需要在HTML文件中包含Qunit的脚本文件和样式文件,然后在JavaScript代码中使用Qunit的API来编写测试用例和测试函数。下面是一个简单的HTML文件,使用Qunit测试一个简单的JavaScript函数: <!DOCTYP…...
网站制作的流程是什么/站内推广方式
目录 柔性数组的定义 柔性数组的特点 柔性数组的优势 C语言🛴 柔性数组的定义 什么是柔性数组呢? C99中,如果在结构体定义的时候,结构体中的最后一个元素允许是未知大小的数组,那么这个数组便叫做 柔性数组 。 下面举个…...
营销型网站建设软件/免费网站推广群发软件
工作回顾前几天,我在公园里进行了一次冲刺回顾。 阳光普照,我们所有人都在努力完成积压工作,因此,这对每个人的努力都是一种不错的回报。 在户外举行回顾展也可以使它充满活力和热情,而这在小房间里很难找到。 我以前…...