当前位置: 首页 > news >正文

6、原型模式(Prototype Pattern,不常用)

原型模式指通过调用原型实例的Clone方法或其他手段来创建对象。

原型模式属于创建型设计模式,它以当前对象为原型(蓝本)来创建另一个新的对象,而无须知道创建的细节。原型模式在Java中通常使用Clone技术实现,在JavaScript中通常使用对象的原型属性实现。

原型模式的Java实现很简单,只需原型类实现Cloneable接口并覆写clone方法即可。Java中的复制分为浅复制和深复制。

  • 浅复制:Java中的浅复制是通过实现Cloneable接口并覆写其Clone方法实现的。在浅复制的过程中,对象的基本数据类型的变量值会重新被复制和创建,而引用数据类型仍指向原对象的引用。也就是说,浅复制不复制对象的引用类型数据。
    package cn.jaa.prototype_pattern;/*** @Author: Jaa* @Description: 浅复制* @Date 2023/11/28 22:25*/
    public class Computer implements Cloneable {private String cpu;private String memory;private String disk;public Computer(String cpu, String memory, String disk) {this.cpu = cpu;this.memory = memory;this.disk = disk;}@Overrideprotected Object clone() { // 浅复制try {return (Computer) super.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();return null;}}@Overridepublic String toString() {return "Computer{" +"cpu='" + cpu + '\'' +", memory='" + memory + '\'' +", disk='" + disk + '\'' +'}';}
    }
    
  • 深复制:在深复制的过程中,不论是基本数据类型还是引用数据类型,都会被重新复制和创建。简而言之,深复制彻底复制了对象的数据(包括基本数据类型和引用数据类型),浅复制的复制却并不彻底(忽略了引用数据类型)。
    package cn.jaa.prototype_pattern;/*** @Author: Jaa* @Description: 深复制* @Date 2023/11/28 22:33*/
    public class ComputerDetail implements Cloneable {private String cpu;private String memory;private Disk disk;public ComputerDetail(String cpu, String memory, Disk disk) {this.cpu = cpu;this.memory = memory;this.disk = disk;}@Overrideprotected Object clone() { // 深复制try {ComputerDetail computerDetail = (ComputerDetail) super.clone();computerDetail.disk = (Disk) this.disk.clone(); // 引用对象深复制return computerDetail;} catch (CloneNotSupportedException e) {e.printStackTrace();return null;}}@Overridepublic String toString() {return "ComputerDetail{" +"cpu='" + cpu + '\'' +", memory='" + memory + '\'' +", disk=" + disk +'}';}
    }
    package cn.jaa.prototype_pattern;/*** @Author: Jaa* @Description:* @Date 2023/11/28 22:34*/
    public class Disk implements Cloneable {private String ssd;private String hhd;public Disk(String ssd, String hhd) {this.ssd = ssd;this.hhd = hhd;}@Overrideprotected Object clone() { // 应用对象深复制try {return (Disk) super.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();return null;}}@Overridepublic String toString() {return "Disk{" +"ssd='" + ssd + '\'' +", hhd='" + hhd + '\'' +'}';}
    }
    

    浅复制、深复制测试:

    package cn.jaa.prototype_pattern;import lombok.extern.slf4j.Slf4j;/*** @Author: Jaa* @Description: simple and deep clone test* @Date 2023/11/28 22:41*/
    @Slf4j
    public class PrototypeDemoTest {public static void main(String[] args) {// 浅复制Computer computer = new Computer("16core", "16G", "1TB");log.info("before simple clone: " + computer.toString());Computer computerClone = (Computer) computer.clone();log.info("after simple clone: " + computerClone.toString());// 深复制Disk disk = new Disk("256G", "1TB");ComputerDetail computerDetail = new ComputerDetail("16core", "16G", disk);log.info("before deep clone: " + computerDetail.toString());ComputerDetail computerDetailClone = (ComputerDetail) computerDetail.clone();log.info("after deep clone: " + computerDetailClone.toString());}
    }

    运行结果:

相关文章:

6、原型模式(Prototype Pattern,不常用)

原型模式指通过调用原型实例的Clone方法或其他手段来创建对象。 原型模式属于创建型设计模式,它以当前对象为原型(蓝本)来创建另一个新的对象,而无须知道创建的细节。原型模式在Java中通常使用Clone技术实现,在JavaSc…...

图像万物分割——Segment Anything算法解析与模型推理

一、概述 在视觉任务中,图像分割任务是一个很广泛的领域,应用于交互式分割,边缘检测,超像素化,感兴趣目标生成,前景分割,语义分割,实例分割,泛视分割等。 交互式分割&am…...

Redis实战篇笔记(最终篇)

Redis实战篇笔记(七) 文章目录 Redis实战篇笔记(七)前言达人探店发布和查看探店笔记点赞点赞排行榜 好友关注关注和取关共同关注关注推送关注推荐的实现 总结 前言 本系列文章是Redis实战篇笔记的最后一篇,那么到这里…...

游戏配置表的导入使用

游戏配置表是游戏策划的标配,如下图: 那么程序怎么把这张配置表导入使用? 1.首先,利用命令行把Excel格式的文件转化成Json格式: json-excel\json-excel json Tables\ Data\copy Data\CharacterDefine.txt ..\Clien…...

❀dialog命令运用于linux❀

目录 ❀dialog命令运用于linux❀ msgbox部件(消息框) yesno部件(yesno框) inputbox部件(输入文本框) textbox部件(文本框) menu部件(菜单框) fselect部…...

【算法】蓝桥杯2013国C 横向打印二叉树 题解

文章目录 题目链接题目描述输入格式输出格式样例自己的样例输入自己的样例输出 思路整体思路存储二叉搜索树中序遍历并存储计算目标数的行号dfs遍历并写入数组初始化和处理输入输出初始化处理输入处理输出 完整的代码如下 结束语更新初始化的修改存储二叉搜索树的修改中序遍历和…...

XunSearch 讯搜 error: storage size of ‘methods_bufferevent’ isn’t known

报错: error: storage size of ‘methods_bufferevent’ isn’t known CentOS8.0安装迅搜(XunSearch)引擎报错的解决办法 比较完整的文档 http://www.xunsearch.com/download/xs_quickstart.pdf 官方安装文档 http://www.xunsearch.com/doc/php/guide/start.in…...

基于AWS Serverless的Glue服务进行ETL(提取、转换和加载)数据分析(三)——serverless数据分析

3 serverless数据分析 大纲 3 serverless数据分析3.1 创建Lambda3.2 创建API Gateway3.3 结果3.4 总结 3.1 创建Lambda 在Lambda中,我们将使用python3作为代码语言。 步骤图例1、入口2、创建(我们选择使用python3.7)3、IAM权限(…...

08、分析测试执行时间及获取pytest帮助

官方用例 # content of test_slow_func.py import pytest from time import sleeppytest.mark.parametrize(delay,(1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,1.0,0.1,0.2,0,3)) def test_slow_func(delay):print("test_slow_func {}".format(delay))sleep(delay)assert…...

视频集中存储/智能分析融合云平台EasyCVR平台接入rtsp,突然断流是什么原因?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…...

JavaScript 复杂的<三元运算符和比较操作>的组合--案例(一)

在逆向的时候,碰上有些复杂的js代码,逻辑弄得人有点混; 因此本帖用来记录一些棘手的代码,方便自己记忆,也让大家拓展认识~ ----前言 内容: function(e, t, n) {try {1 (e "{" e[0] ? JSON.parse(e) : JSON.parse(webInstace.shell(e))).Status || 200 e.Code…...

uniapp搭建内网映射测试https域名

搭建Https域名服务器 使用github的frp搭建,使用宝塔申请免费https证书,需要先关闭宝塔nginx的反向代理,申请完域名后再开启反向代理即可。 教程 新版frp搭建教程 启动命令 服务器端 sudo systemctl start frps本地 cd D:\软件安装包\f…...

国防科技大博士招生入学考试【50+论文主观题】

目录 回答模板大意创新和学术价值启发 论文分类(根据问题/场景分类)数学问题Efficient Multiset Synchronization(高效的多集同步【简单集合/可逆计数Bloom过滤器】)大意创新和学术价值启发 An empirical study of Bayesian netwo…...

CUDA简介——编程模式

1. 引言 前序博客: CUDA简介——基本概念 CPU是用于控制的。即,host控制整个程序流程: 1)程序以Host代码main函数开始,然后顺序执行。 Host代码是顺序执行的,并执行在CPU之上。Host代码会负责Launch ke…...

Linux 软件安装

目录 一、Linux 1、Linux异常解决 1、JDK安装 1、Linux卸载JDK 2、Linux安装JDK 2、Redis安装 一、Linux 1、Linux异常解决 1、Another app is currently holding the yum lock; waiting for it to exit... 解决办法: rm -f /var/run/yum.pid1、杀死这个应用程序 ps a…...

flask之邮件发送

一、安装Flask-Mail扩展 pip install Flask-Mail二、配置Flask-Mail 格式:app.config[参数]值 三、实现方法 3.1、Mail类 常用类方法 3.2、Message类,它封装了一封电子邮件。构造函数参数如下: flask-mail.Message(subject, recipient…...

【Filament】Filament环境搭建

1 前言 Filament 是一个实时物理渲染引擎,用于 Android、iOS、Linux、macOS、Windows 和 WebGL 平台。该引擎旨在提供高效、实时的图形渲染,并被设计为在 Android 平台上尽可能小而尽可能高效。Filament 支持基于物理的渲染(PBR)&…...

外包干了2个月,技术倒退2年。。。。。

先说一下自己的情况,本科生,20年通过校招进入深圳某软件公司,干了接近4年的功能测试,今年国庆,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…...

使用 python ffmpeg 批量检查 音频文件 是否损坏或不完整

自用工具,检查下载的音乐是否有损坏 或 下载不完整 使用方法,把 in_dir r’D:\158首无损珍藏版’ 改成你自己的音乐文件夹路径 如果发现文件有损坏,则会在命令行打印错误文件的路径 注意,要求 ffmpeg 命令可以直接在命令行调用…...

Django:通过user-agent判断请求是来自移动端还是PC端(电脑端)

第一种思路: 根据博文 Djano的request.META是什么?的研究成果,先判断有无键HTTP_SEC_CH_UA_MOBILE,如果没有,再去按博文 网站如何判断请求是来自手机-移动端还是PC-电脑端?如何让网站能适应不同的客户端&am…...

Linux中ssh远程登录系统和远程拷贝

本章主要介绍ssh远程登录系统和远程拷贝的方法 ssh的基本用法打开远程图形化界面ssh无密码登录和安全操作Windows远程登录远程拷贝 很多时候服务器并没有显示器,我们也不可能每次都通过控制台去管理服务器,这时就需 要远程登录。远程登录到服务器可以通…...

git常用命令小记

(文章正在持续更新中) git init - 在当前目录下初始化一个新的 Git 仓库。 git clone [url] - 克隆远程仓库到本地。 git add [file] - 将文件添加到暂存区。 git commit -m "commit message" - 将添加到暂存区的文件提交到本地仓库。 git pus…...

深入Android S (12.0) 探索Framework之输入系统IMS的构成与启动

文章目录 前言一、输入系统的基本组成部分二、输入系统相关源码分析1、IMS 构建1.1、SystemServer # startOtherServices()1.2、InputManagerService1.3、NativeInputManager # nativeInit()1.4、NativeInputManager1.5、InputManager1.6、InputDispatcher1.7、InputReader1.8、…...

SoC with CPLD and MCU ?

AG32 MCU 产品支持多种接口外设,具备与业界主流产品的兼容性,并内置额外的2K FPGA 可编程逻辑。 产品支持 LQFP-48,LQFP-64,LQFP-100 ,QFN-32等不同封装。其所有可用 IO 都可以任意地进行映射和互换,以灵活…...

基于AWS Serverless的Glue服务进行ETL(提取、转换和加载)数据分析(二)——数据清洗、转换

2 数据清洗、转换 此实验使用S3作为数据源 ETL: E extract 输入 T transform 转换 L load 输出 大纲 2 数据清洗、转换2.1 架构图2.2 数据清洗2.3 编辑脚本2.3.1 连接数据源(s3)2.3.2. 数据结构转换2.3.2 数据结构拆分…...

vuepress-----6、时间更新

# 6、时间更新 基于Git提交时间修改文字时间格式 moment # 最后更新时间 # 时间格式修改 下载库文件 yarn add momentconst moment require(moment); moment.locale(zh-cn)module.exports {themeConfig: {lastUpdated: 更新时间,},plugins: [[vuepress/last-updated,{trans…...

C++ ini配置文件的简单读取使用

ini文件就是简单的section 下面有对应的键值对 std::map<std::string, std::map<std::string, std::string>>MyIni::readIniFile() {std::ifstream file(filename);if (!file.is_open()) {std::cerr << "Error: Unable to open file " << …...

【稳定检索|投稿优惠】2024年经济管理与安全科学国际学术会议(EMSSIC 2024)

2024年经济管理与安全科学国际学术会议(EMSSIC 2024) 2024 International Conference on Economic Management and Security Sciences(EMSSIC 2024) 一、【会议简介】 2024年经济管理与安全科学国际学术会议(EMSSIC 2024)&#xff0c;将于繁华的上海城召开。这次会议的主题是“…...

什么是网站?

这篇文章是我学习网站开发&#xff0c;阶段性总结出来的。可以帮助你 通俗易懂 地更加深刻理解网站的这个玩意。 一&#xff0c;网站和网页的区别&#xff1f; 网站是由一个个网页组成。我们在浏览器上面看到的每一个页面就是网页&#xff0c;这些 相关的 网页组成一个网站。…...

pg_stat_replication.state 含义

在PostgreSQL中&#xff0c;pg_stat_replication视图提供了有关连接到主服务器的流式复制进程&#xff08;备用服务器&#xff09;的信息。该视图中的一个列是state&#xff0c;它指示复制进程的当前状态。 state列可以具有各种值: startup: This WAL sender 刚开始运行 catc…...

网站建设外包被骗/百度推广怎么开户

jQuery实现倒计时效果-杨秀徐 本实例效果&#xff1a;剩余368天22小时39分57秒结束 代码简单易懂&#xff0c;适用各种倒计时&#xff1b; http://www.cnblogs.com/sntetwt/category/287335.html 12345678910111213141516171819202122232425262728293031323334353637383940414…...

网站建设广州/万网域名注册

日前有万科柏悦湾小区业主向中山日报反映称&#xff0c;最近一段时间业主进出小区发现了件奇怪事&#xff1a;物管公司在博爱路一侧进出小区的唯一一条外部道路上安了道闸&#xff0c;大家很担心下一步进出小区会不会被收费。业主梁先生表示&#xff0c;部分业主对物管此行为感…...

网站建设不完整/天天seo伪原创工具

&#xff08;1&#xff09;如何将一个jar进行执行&#xff1f; 在java开发中&#xff0c;直接使用shell脚本执行***。sh文件。 文件中执行某一个类加载进行类的加载&#xff0c;MATE_INF下面执行某个类进行启动。 整个类启动之后会启动一个java的进程和一个主线程&#xff0…...

郑州 服装网站建设/做做网站

这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/computer-scienceclass4-2018/homework/2826 我在这个课程的目标是 熟练指针&#xff0c;能够精通关于数组内部运作原理 这个作业在那个具体方面帮助我实现目标 如何输出…...

网站备案注销 万网/网站建设费用明细表

JCommander可以帮我们解析Java的命令行工具&#xff0c;主要利用Parameter配置自己所需要的参数&#xff1b; JCommander 案例 在一般应用场景&#xff0c;我们可能只需要设置Parameter以下几个属性值&#xff1a; * names 设置命令行参数&#xff0c;如-old * required 设置…...

面试网站建设问题/电话营销销售系统

“云计算”这个词在今年颇为流行&#xff0c;以至于我终于不能再继续厚着脸皮当作没看到了。最初&#xff0c;我以为云计算就是一堆客户端计算机紧密的团结在一起&#xff0c;为一个共同的伟大的问题而献出自己的业余时间。后来某男告诉我&#xff0c;那叫网格计算&#xff0c;…...