9【原型模式】复制一个已存在的对象来创建新的对象
你好,我是程序员雪球。
今天我们来学习23种设计模式之原型模式,在平时开发过程中比较少见。我带你了解什么是原型模式,使用场景有哪些?有什么注意事项?深拷贝与浅拷贝的区别,最后用代码实现一个简单的示例。

一、是什么?
原型模式是一种创建对象的模式,它通过复制一个已存在的对象来创建新的对象,而不是通过传统的 new 操作符来创建对象。这种模式的主要目的是提高创建对象的效率和性能,尤其是在需要创建大量相似对象的情况下。
二、使用场景:
- 当创建对象的过程比较复杂或耗时较长时,使用原型模式可以提高创建对象的效率。
- 当需要创建大量相似对象时,使用原型模式可以减少内存的开销。
- 当需要动态地创建对象时,使用原型模式可以方便地实现对象的复制和修改。
三、注意事项
- 在使用原型模式时,需要注意深拷贝和浅拷贝的区别。浅拷贝只复制对象的引用,而不复制对象的内容,因此在修改原始对象时,复制对象也会受到影响。深拷贝则会复制对象的所有内容,包括嵌套对象,因此在修改原始对象时,复制对象不会受到影响。
- 在使用原型模式时,需要注意对象的创建和销毁。由于原型模式通过复制对象来创建新对象,因此需要确保原始对象在不再需要时被正确地销毁,以释放内存资源。
四、代码示例
接下来让我们用 Java 来实现一个简单的示例吧。
public class PrototypePattern {
public static void main(String[] args) {
PrototypePrototype obj1 = new PrototypePrototype("Apple");
PrototypePrototype obj2 = obj1.clone();
// 修改 obj2 的属性
obj2.setName("Banana");
// 输出 obj1 和 obj2 的属性
System.out.println(obj1.getName());
System.out.println(obj2.getName());
}
}
class PrototypePrototype implements Cloneable {
private String name;
public PrototypePrototype(String name) {
this.name = name;
}
// 获取对象的克隆
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
// 获取对象的名称
public String getName() {
return name;
}
// 设置对象的名称
public void setName(String name) {
this.name = name;
}
}
在上面的示例中,我们定义了一个 PrototypePrototype 类,它实现了 Cloneable 接口,并重写了 clone() 方法。在 PrototypePrototype 类中,我们有一个私有成员变量 name,用于存储对象的名称。我们还提供了 getName() 和 setName() 方法,用于获取和设置对象的名称。
在 main() 方法中,我们创建了两个 PrototypePrototype 对象 obj1 和 obj2。我们使用 obj1.clone() 方法来创建 obj2,这将返回一个与 obj1 完全相同的副本。然后,我们修改 obj2 的名称,并输出 obj1 和 obj2 的名称。
通过使用原型模式,我们可以通过复制已存在的对象来创建新的对象,而不必每次都重新创建对象。这样可以提高创建对象的效率和性能,尤其是在需要创建大量相似对象的情况下。
总结

一、是什么?
原型模式通过复制一个已存在的对象来创建新的对象,而不是通过传统的 new 操作符来创建对象。这样可以提高创建对象的效率和性能,尤其是在需要创建大量相似对象的情况下。
二、使用场景:
1、创建比较耗时的对象场景;
2、创建大量相似对象场景;
3、动态创建对象场景;
三、注意事项:
1、浅拷贝只复制对象的引用,而不复制对象的内容,因此在修改原始对象时,复制对象也会受到影响。
2、深拷贝则会复制对象的所有内容,包括嵌套对象,因此在修改原始对象时,复制对象不会受到影响。
3、在使用原型模式时,需要注意对象的创建和销毁。
想要了解更多设计模式相关知识,请关注我吧,下期持续更新。
相关文章:
9【原型模式】复制一个已存在的对象来创建新的对象
你好,我是程序员雪球。 今天我们来学习23种设计模式之原型模式,在平时开发过程中比较少见。我带你了解什么是原型模式,使用场景有哪些?有什么注意事项?深拷贝与浅拷贝的区别,最后用代码实现一个简单的示例…...
谷粒商城实战(013 业务-认证服务-短信验证)
Java项目《谷粒商城》架构师级Java项目实战,对标阿里P6-P7,全网最强 总时长 104:45:00 共408P 此文章包含第211p-第p219的内容 介绍 认证中心要集成 社交登录、OAuth2.0、单点登录 等功能 OAuth 2.0: 问题解决: OAuth 2.0 主要…...
Unity中支持泰语--没有版权限制
在Unity中支持泰语主要涉及以下几个方面: 选择合适的字体:在Unity中,确保使用支持泰文字符的字体是至关重要的。例如,可以选择使用Noto Serif Thai字体,这是一个支持泰语的字体2。 处理Unity版本问题:某些…...
C语言传统垃圾收集器的缺陷以及我的思路
传统的比如Boehm回收器,都是在malloc/realloc/free上做文章,参考这篇文章【How the Boehm Garbage Collector Works】的解释,因为C数据结构是无法预料的,内存里面并没有特殊标记,很难判断哪些是指针哪些是数据…...
数据交换格式
一、什么是数据交换格式 在计算机的不同程序之间,或者不同的编程语言之间进行交换数据,也需要一种大家都能听得懂得‘语言’,这就是数据交换格式,它通过文本以特定的形式来进行描述数据。 二、常用的几种数据交换格式 客户端常…...
电力系统卫星授时信号安全隔离装置防护方案
电力系统是国家关键基础设施, 电力安全关系国计民生, 是国家安全的重要保障, 与政治安全、经济安全、 网络安全、社会安全等诸多领域密切关联。电网运行情况瞬息万变,为了在其发生事故时能够及时得到处理,需要统一的时…...
【编程TOOL】VC++6.0下载安装配置使用保姆式教程
目录 编辑 1.软件介绍 2.软件下载 3.软件安装 3.1.下载得到可执行文件并双击进行安装 3.2. 点击下一步 3.3. 选择安装位置 3.4. 勾选“创建桌面快捷方式”并点击下一步 5. 点击安装并等待 3.6. 先取消运行,后点击完成,软件即安装完毕 4.兼容性配置 4.1…...
组织机构代码是哪几位?营业执照怎么看组织机构代码?
组织机构代码是哪几位? 组织机构代码通常指的是组织机构代码证上的一组特定数字,它用于唯一标识一个组织或机构。在中国,组织机构代码由9位数字组成,前8位是本体代码,最后1位是校验码。这组代码是按照国家有关标准编制的&#x…...
nginx禁止ip访问,只允许域名访问
无论ip直接访问,还是通过域名访问,最终都是通过ip访问到服务器浏览器访问时会携带Host参数,通过ip访问时携带的是ip,通过域名访问时携带的是域名nginx收到请求后判断host的值,如果判断出不是通过域名访问的则拒绝&…...
10组Python面试高频问题与详尽解答指南
大家好,你们准备好了吗?面试官们总喜欢出其不意地问些让人头大的问题。别担心,今天我来帮你们梳理10个Python面试中的热门难题,让你的回答既专业又有趣!让我们一起变身Python高手吧! 1. 问题: 什么是Pytho…...
使用SpringBoot将中国地震台网数据保存PostGIS数据库实践
目录 前言 一、数据转换 1、Json转JavaBean 2、JavaBean与数据库字段映射 二、空间数据表设计 1、表结构设计 三、PostGIS数据保存 1、Mapper接口定义 2、Service逻辑层实现 3、数据入库 4、运行实例及结果 总结 前言 在上一篇博客中基于Java的XxlCrawler网络信息爬…...
后端返回树结构
出参结构 Getter Setter public class TreeResponse implements Serializable {// 主键private Long id;// 父级节点private Long parentId;// 层级private Byte layer;// 编码private String docCode;// 名称private String docName;// 子节点private List<TreeResponse&g…...
C语言——通讯录的实现
一.前言 嗨嗨嗨,又和大家见面了!前面我们讲到了如何实现一个循序表。现在我们开始讲解如何基于循序表来实现通讯录功能。 二.正文 通讯录中的SeqlList.h #pragma once //#define SLDateType int #include<stdio.h> #include<stdlib.h> #…...
Next-Scale Prediction、InstantStyle、Co-Speech Gesture Generation
本文首发于公众号:机器感知 Next-Scale Prediction、InstantStyle、Co-Speech Gesture Generation Visual Autoregressive Modeling: Scalable Image Generation via Next-Scale Prediction We present Visual AutoRegressive modeling (VAR), a new generation p…...
class中 padding和margin的用法;
如果我们想要移动盒子等的位置 ,除了可以用相对定位和绝对定位还可以用margin 和paddinng; 结构如图所示 margin和padding的用法: padding和margin后面可以跟1或2或3或4个数,按照顺序分别是上,右,下&…...
单独使用YOLOV9的backbone网络
前言 YOLO系列的网络结构都是通过.yaml来进行配置的,当要单独想使用其中的backbone网络时,可以通过yaml配置文件来进行网络搭建。 backbone的yaml配置文件与网络结构 backbone:[[-1, 1, Silence, []], # conv<...
WordPress JS Support Ticket插件 RCE漏洞复现
0x01 产品简介 WordPress和WordPress plugin都是WordPress基金会的产品。JS Support Ticket是使用在其中的一套开源票务系统插件。 0x02 漏洞概述 WordPress中的JS Support Ticket插件存在未经上传漏洞,未经身份验证的攻击者可以上传恶意脚本的服务器,执行任意指令,从而获…...
加盟代理短视频无人直播项目,开启互联网线上经营新模式
随着短视频行业的快速发展和用户数量的不断增长,短视频无人直播项目成为了近年来备受关注的创业机会。本文将分享如何加盟代理短视频无人直播项目,开启属于自己的经营新模式。 一、了解无人直播项目的核心优势 短视频无人直播项目是结合了短视频与直播的…...
spring高级篇(一)
1、ApplicationContext与BeanFactory BeanFactory是ApplicationContext的父级接口:(citlaltu查看类关系图) 在springboot的启动类中,我们通过SpringApplication.run方法拿到的是继承了ApplicationContext的ConfigurableApplicatio…...
免费的GPT-3.5 API服务aurora
什么是 aurora ? aurora 是利用免登录 ChatGPT Web 提供的无限制免费 GPT-3.5-Turbo API 的服务,支持使用 3.5 的 access 调用。 【注意】:仅 IP 属地支持免登录使用 ChatGPT的才可以使用(也可以自定义 Baseurl 来绕过限制&#x…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...
