java什么场景使用克隆,Java设计模式----原型模式(克隆模式)

2023-11-07

场景

思考一下:克隆技术是怎么样的过程?

JavaScript语言中的,继承怎么实现?那里面也有prototype

原型模式

通过new产生一个对象需要繁琐的数据准备或访问权限,则可以使用原型模式。

就是java中的克隆技术,以某个对象为原型,复制出新的对象。显然,新的对象具备原型对象的特点。

优势有:效率高(直接克隆,避免了重新执行构造过程步骤)。

克隆类似于new,但是不同于new。new创建新的对象属性采用的是默认值。克隆出的对象的属性值完全和原型对象相同。并且克隆出的新对象改变不会影响原型对象。然后,再修改克隆对象的值。

原型模式实现

Cloneable接口和clone方法

Prototype模式中实现起来最困难的地方就是内存复制操作,所幸在Java中提供了clone()方法替我们做了绝大部分事情。

package prototype;

import java.util.Date;

public class Sheep implements Cloneable{

private String sname;

private Date birthday;

public Sheep() {

}

public Sheep(String sname, Date birthday) {

this.sname = sname;

this.birthday = birthday;

}

public String getSname() {

return sname;

}

public void setSname(String sname) {

this.sname = sname;

}

public Date getBirthday() {

return birthday;

}

public void setBirthday(Date birthday) {

this.birthday = birthday;

}

@Override

protected Object clone() throws CloneNotSupportedException {

Object obj = super.clone();

return obj;

}

}

package prototype;

import java.util.Date;

/**

* @Description: 浅克隆

*/

public class Client {

public static void main(String[] args) throws Exception {

Date date = new Date();

Sheep s1 = new Sheep("少利",date);

Sheep s2 = (Sheep) s1.clone();

System.out.println(s1);

System.out.println(s1.getSname());

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

date.setTime(123123123141L);

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

s2.setSname("多利");

System.out.println(s2);

System.out.println(s2.getSname());

System.out.println(s2.getBirthday());

}

}

输出:

prototype.Sheep@52ab6c19

少利

Wed Apr 25 10:31:31 CST 2018

Mon Nov 26 08:52:03 CST 1973

prototype.Sheep@6929ae9b

多利

Mon Nov 26 08:52:03 CST 1973

package prototype;

import java.util.Date;

public class Sheep2 implements Cloneable{

private String sname;

private Date birthday;

public Sheep2() {

}

public Sheep2(String sname, Date birthday) {

this.sname = sname;

this.birthday = birthday;

}

public String getSname() {

return sname;

}

public void setSname(String sname) {

this.sname = sname;

}

public Date getBirthday() {

return birthday;

}

public void setBirthday(Date birthday) {

this.birthday = birthday;

}

@Override

protected Object clone() throws CloneNotSupportedException {

Object obj = super.clone();

// 深克隆实现

Sheep2 sheep = (Sheep2) obj;

sheep.birthday = (Date) this.birthday.clone();

return obj;

}

}

package prototype;

import java.util.Date;

/**

* @Description: 深克隆

*/

public class Client2 {

public static void main(String[] args) throws Exception{

Date date = new Date();

Sheep2 s1 = new Sheep2("少利",date);

Sheep2 s2 = (Sheep2) s1.clone();

System.out.println(s1);

System.out.println(s1.getSname());

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

date.setTime(123123123141L);

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

s2.setSname("多利");

System.out.println(s2);

System.out.println(s2.getSname());

System.out.println(s2.getBirthday());

}

}

输出:

prototype.Sheep2@55991e21

少利

Wed Apr 25 10:33:34 CST 2018

Mon Nov 26 08:52:03 CST 1973

prototype.Sheep2@2533b5db

多利

Wed Apr 25 10:33:34 CST 2018

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

package prototype;

import java.io.ByteArrayInputStream;

import java.io.ByteArrayOutputStream;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.util.Date;

/**

* @Description: 利用序列化和反序列化技术实现深克隆

*/

public class Client3 {

public static void main(String[] args) throws Exception{

Date date = new Date();

Sheep s1 = new Sheep("少利",date);

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();

System.out.println(s1);

System.out.println(s1.getSname());

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

date.setTime(123123123141L);

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

s2.setSname("多利");

System.out.println(s2);

System.out.println(s2.getSname());

System.out.println(s2.getBirthday());

}

}

输出:

prototype.Sheep@667053be

少利

Wed Apr 25 10:47:00 CST 2018

Mon Nov 26 08:52:03 CST 1973

prototype.Sheep@528ef256

多利

Wed Apr 25 10:47:00 CST 2018

普通new方式创建对象和clone方式创建对象的效率差异

package prototype;

import java.util.concurrent.TimeUnit;

public class Client4 {

public static void testNew(int size){

long start = System.currentTimeMillis();

for (int i=0;i

Laptop t = new Laptop();

}

long end = System.currentTimeMillis();

System.out.println("new的方式创建耗时:"+(end-start));

}

public static void testClone(int size) throws CloneNotSupportedException {

long start = System.currentTimeMillis();

Laptop t = new Laptop();

for (int i=0;i

Laptop clone = (Laptop) t.clone();

}

long end = System.currentTimeMillis();

System.out.println("clone的方式创建耗时:"+(end-start));

}

public static void main(String[] args) throws Exception{

testNew(1000);

testClone(1000);

}

}

class Laptop implements Cloneable{

public Laptop(){

try {

TimeUnit.MILLISECONDS.sleep(10);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

@Override

protected Object clone() throws CloneNotSupportedException {

return super.clone();

}

}

输出:

new的方式创建耗时:10324

clone的方式创建耗时:11

如果需要段时间创建大量对象,并且new的过程比较耗时,则可以考虑使用原型模式。

开发中的应用场景

原型模式很少单独出现,一般是和工厂方法模式一起出现,通过clone的方法创建一个对象,然后由工厂方法提供给调用者。

spring中bean的创建实际就两种模式:单例模式和原型模式。(当然,原型模式需要和工厂模式搭配起来)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java什么场景使用克隆,Java设计模式----原型模式(克隆模式) 的相关文章

  • Git使用手册/Git教程:git push 推送提交本地仓库代码文件到远程仓库

    相关文章 关于验证是否存在ssh配置以及生成SSH Key的方法可以参照文章 Git使用手册 生成SSH Key 关于SSH Key的使用和公钥在gitHub gitLab的配置等 请参考文章 Git使用手册 使用SSH Key及配置SSH
  • 关于知道后序序列和中序序列确定前序序列

    以下是大神的解释 摘自洛谷题解 比较清晰 DEBAFCG EDBFGCA 首先这棵树的根是A 后序排列的最后一个 输出A 然后在中序排列中找到A的位置 发现它左右各有三个点 分别是它的左右子树 把中序排列左边三个点和后序排列的前三个点作为左
  • python 定时器使用教程 apscheduler模块,检查文件夹

    1 简介 apscheduler是python中的任务定时模块 它包含四个组件 触发器 trigger 作业存储 job store 执行器 executor 调度器 scheduler 2 安装 pip install apschedul
  • Spring 入门(控制反转IOC、依赖注入DI、Bean的作用范围、Bean的生命周期)

    1 什么是框架 框架 Framework 是整个或部分系统的可重用设计 表现为一组抽象构件及构件实例间交互的方法 另一种定义认为 框架是可被应用开发者定制的应用骨架 前者是从应用方面而后者是从目的方面给出的定义 2 Java中的框架 Str
  • 电脑阅卷系统

    本软件利用电脑外接摄像头 和用普通纸张打印 或复印 的答题卡进行选择题的阅卷 能实时播报成绩产生作答分析 软件名称是 精易摄像头阅卷软件 功能特色 1 精易软件的设计精度和速度已达到实际使用需要 填涂到位的情况下读卡速度是每张答题卡用时1
  • 决策树应用实例③——银行借贷模型

    决策树系列目录 文末有惊喜彩蛋 决策树 信息熵 信息增益 基尼系数 决策树 决策树算法原理 ID3 C4 5 CART 决策树 决策树参数介绍 分类和回归 决策树 决策树Sklearn调参 GridSearchCV调参及过程做图 决策树 P
  • NoSQL数据库简介

    NoSQL代表 不仅是SQL 指的是一种数据库管理系统 旨在处理大量非结构化和半结构化数据 与使用具有预定义架构的表格格式的传统SQL数据库不同 NoSQL数据库是无模式的 并且允许灵活和动态的数据结构 NoSQL数据库是必需的 因为它们可
  • 解决:Not creating XLA devices, tf_xla_enable_xla_devices not set

    解决 Not creating XLA devices tf xla enable xla devices not set 实验环境 提示如下 分析原因 解决方法 实验环境 Windows 10 NVIDIA GeForce GTX 105
  • 易经中的一些见解

    曾仕强教授 易经不只是用来趋吉避凶 低端讲法 高端讲法 持正向善 云端讲法 心安理得 求得好死 好死指的是死得其时 死得其所 死得心安理得 趋吉避凶是手段 不是目的 顺自然 重人伦 自作自受 缺角 修治 完人 慎始 反省提升 善终 人生的乐
  • InvokeHelper调用引发异常

    代码原来的实现是 try InvokeHelper catch GetLastError 好吧 引发了异常 但是GetLastError 永远为零 状况了 网上又找不到相关资料 知道自己一步一步地从InvokeHelper跟踪进去 发现里面
  • Spring Cloud OpenFeign 超时设置与开启重试

    超时设置 数据中台HRestful API请求 feign okhttp enabled true client config default 日志打印级别 loggerLevel basic 跨服务接口请求超时 readTimeout 2
  • Windows操作系统截屏快捷键

    1 Print Screen截屏 不只是win10系统独有的 只要在键盘上按下 Print Screen 键 就会截取当前屏幕并储存在剪切板中 进入文档编辑器 文本文档除外 图片处理工具 QQ等聊天窗口进行粘贴 Ctrl V 操作 就可以获
  • os.path函数简要分析

    os模块简介 os模块实现了在路径上的一些有用的功能 os path abspath path 返回一个绝对路径名 import os path abspath os path abspath User home Work print ab
  • 静态代码扫描环境搭建(mac)

    一 安装要求 1 1 软件要求 在进行sonarqube环境安装和搭建前务必确定当前机器和平台配置满足如下要求 机器上需要安装java Oracle JRE 11 或 OpenJDK 11 SonarQube服务器需要的java版本为11
  • 数据分析-数据清洗与整理

    1 数据清洗 第一步 对异常值进行处理 首先 查看原数据库是否一样 然后 查询是否信息录入时出现错误 最后 看看是不是顾客随意填写的信息 第二步 对离群值进行处理 首先 查询是否与原数据库一致 然后 查询是否信息录入错误 最后 判断是否符合
  • Selenium成长之路-18多窗口切换

    在实际测试过程中 打开多窗口是进行测试是很正常的事情 那么在自动化测试中 也需要开启多窗口来进行测试 我们来分析一下 打开多窗口测试的思路 1 打开一个目标网页 2 再次打开新的网页 3 获得所有窗口的 4 循环判断窗口是否为当前窗口 5
  • 2024最强秋招八股文(精简、纯手打)

    7 28日已更新 错误已修改 有错误的地方 欢迎大家留言 目录 一 Java基础篇 1 接口和抽象类的区别 2 重载和重写的区别 3 和equals的区别 4 异常处理机制 5 HashMap原理 6 想要线程安全的HashMap怎么办 7
  • 让idea自动生成类关系图

    学习了解一些开源的工具源码 有时需要了解到程序入口及项目类之间的关系 Idea工具提供了这个功能 以Jmeter5 1 1源码为例 看下RemoteJMeterEngineImpl类的关系图 操作方法 1 定位到RemoteJMeterEn
  • 窗体的扩展样式GWL_EXSTYLE: 用于SetWindowLong

    SetWindowLong Handle GWL EXSTYLE GetWindowLong Handle GWL EXSTYLE or WS EX TRANSPARENT or WS EX LAYERED WS EX ACCEPTFILE

随机推荐

  • 若依框架主子表数据导出问题

    一 使用若依框架导出主子表数据因为返回的数据中含有子表的集合信息 导致excel表格中多出一行标题 二 在Controller层写入导出的方法 三 这边返回的数据是主表的数据 主表数据的实体类中含有子表的集合信息 四 如果不想要子表信息就把
  • 车载无线控制服务器,车载无线视频监控系统应用整体解决方案

    车载视频监控系统整体描述 前言 现如今社会存在一些不良分子扰乱社会治安 盗窃 抢劫 斗殴 民事纠纷 面对这些突发现象 在公安执法 治安巡逻的过程中 很多时候都要随时把过程记录下来 作为记录 取证 证明等各种用途 这时候车载无线视频监控系统起
  • Passing the Message HDU - 3410(单调栈模板题,简单应用)

    题意 现在有n个人站成一行 告诉你每个人的身高 现在每个人都要找到在他左边 比他矮的人中最高的人的位置 同时也要找到 在他右边比他矮的人中最高的人的位置 注意由于他们是站成一行的 所以他们不能越过比他们高的人去看后面的人 也就是说 他只能看
  • IDEA设置忽略idea文件和iml文件

    1 File gt Settings 2 Editor gt File Types 3 红框那里填上 iml idea
  • C语言中的宏定义

    1 简单宏定义 简单的宏定义有如下格式 define指令 简单的宏 define 标识符替换列表 替换列表是一系列的C语言记号 包括标识符 关键字 数 字符常量 字符串字面量 运算符和标点符号 当预处理器遇到一个宏定义时 会做一个 标识符
  • [Android]从零开始的内核编译

    从零开始的内核编译 本教程将基于小米 10S 的内核源码进行实例 其他型号的手机请自行寻找内核源码 具体内容可以参考我的内核编译项目 手机型号查询 1 获取设备 手机 代号 在安卓设备终端 adb shell 上执行 getprop gre
  • 检测之VOC转COCO

    文章目录 1 获取标注文件及label名与ID对应关系 1 1 获取label2id及标注xml路径 2 xml格式转coco 检测系列相关文章参考如下链接 VOC数据的结构介绍及自定义生成 用labelimg自已标注 VOC标准数据的生成
  • Servlet 作业

    一 填空题 1 Servlet 中使用Session 对象的步骤为 调用HttpServletRequest getSession 的得到Session对象 查看Session对象 在会话中保存数据 2 http 全称是 HyperText
  • Python 计算机视觉(二) —— OpenCV 基础

    目录 1 安装配置 2 OpenCV 基础语法 1 读取图像并显示 2 调整显示窗口大小 3 调整图像尺寸大小 4 图像灰度处理 3 几何图形绘制 1 绘制线段 2 绘制矩形 3 绘制圆形 4 绘制椭圆 5 添加文本 总结 1 安装配置 打
  • ssh遇到port 22:No route to host问题

    ssh遇到这个port 22 No route to host的这个问题其实是比较常见的问题 通常是两个思路 检查防火墙状态 检查ssh状态 这两个方面的解决方案非常常见 无非就是查看这两个 防火墙是否关闭和ssh是否正在运行 大家自行百度
  • SpringCloud 使用sentinel

    一 添加依赖
  • 都2023年了,还有必要学SSH框架吗

    在Web开发中 框架是开发效率和代码质量的保障 SSH框架是指结合了Struts2 Spring和Hibernate3三个开源框架所形成的一种框架 那么 在2023年 我们是否仍然需要学习SSH框架呢 本文将进行探讨 分析SSH框架的优缺点
  • 高中信息技术python知识点_高中信息技术《Python语言》模块试卷

    高中信息技术 Python语言 模块试卷 由会员分享 可在线阅读 更多相关 高中信息技术 Python语言 模块试卷 3页珍藏版 请在人人文库网上搜索 1 区县 姓名 座号 密 封 线 高中信息技术Python语言模块试卷本试卷分为五大题
  • 攻防世界Web:Web_php_wrong_nginx_config

    首先进来是一个登录页面 通过御剑扫描 发现了robots txt 打开发现两个php文件 hint php Hack php是跳转到登录页面 抓包看看Hack php 发现了可疑的点Cookie isLogin 0 不妨修改为1 进入控制中
  • Docker 自动启动和容器自动启动

    一 docker 服务启动启动 开启 docker 自启动 systemctl enable docker service 关闭 docker 自启动 systemctl disable docker service 二 docker 容器
  • C++ 线程局部变量thread_local

    本文转自 https blog csdn net aguoxin article details 103968031 Linux中的线程局部存储 一 本章节转自 https blog csdn net cywosp article deta
  • 北京大学肖臻老师《区块链技术与应用》公开课笔记13——BTC匿名性篇2(零知识证明)

    北京大学肖臻老师 区块链技术与应用 公开课笔记 比特币回顾问答篇 对应肖老师视频 click here 全系列笔记请见 click here About Me 点击进入我的Personal Page 匿名性部分第一节 匿名性分析请见 cli
  • UncaughtExceptionHandler异常处理机制

    解释 UncaughtExceptionHandler类是java1 5里新增的 Thread类里面的一个函数式接口类的 类名意思为 未捕获的异常处理 该类的注释接口意思 接口处理器时调用线程突然终止 由于未捕获到异常 当一个线程要终止由于
  • mysql json字段长度_mysql5.7 新增的json字段类型

    一 我们先创建一个表 准备点数据 CREATE TABLE json test id int 11 unsigned NOT NULL AUTO INCREMENT COMMENT ID json json DEFAULT NULL COM
  • java什么场景使用克隆,Java设计模式----原型模式(克隆模式)

    场景 思考一下 克隆技术是怎么样的过程 JavaScript语言中的 继承怎么实现 那里面也有prototype 原型模式 通过new产生一个对象需要繁琐的数据准备或访问权限 则可以使用原型模式 就是java中的克隆技术 以某个对象为原型