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

原型模式(Prototype Pattern)——对象克隆、深克隆与浅克隆及适用场景

原型模式(Prototype Pattern)是设计模式中的一种创建型模式,目的是通过复制现有的对象来创建新的对象,而不是通过传统的实例化方式。原型模式常常用于需要创建大量类似对象的场景,可以提高性能并减少资源的消耗。下面将详细介绍原型模式的基本概念、对象克隆的实现、深克隆与浅克隆的区别以及原型模式的适用场景。

什么是原型模式

原型模式的核心思想是:通过“复制”一个已有的实例(原型),来创建新的对象,而不需要重新初始化一个新的对象。这样可以避免一些对象的重复构建,尤其是当对象的创建成本较高时,使用原型模式可以显著提高性能。

原型模式的结构

原型模式通常由以下几个部分构成:

  • Prototype(原型)接口:该接口声明一个克隆方法(如 clone()),该方法用于克隆当前对象。
  • ConcretePrototype(具体原型):实现克隆方法的具体类,通常该类中包含需要复制的属性或数据。
  • Client(客户端):负责使用原型对象,通过调用原型的克隆方法来创建新的实例。

对象克隆

对象克隆指的是通过现有对象创建一个完全相同的新对象。克隆操作可以通过两种方式实现:

  • 浅克隆(Shallow Copy):仅复制对象本身的引用,不复制引用类型的属性对象。即复制对象的字段,但引用类型的字段仍然指向原对象中的相同地址。
  • 深克隆(Deep Copy):复制对象及其所有引用的对象,确保原对象和新对象之间完全独立。所有的对象和其包含的引用对象都会被重新创建一份。

浅克隆(Shallow Copy)

浅克隆是指复制对象时,只复制对象的基本数据类型字段和引用类型字段的引用,而不对引用类型字段指向的对象进行克隆。换句话说,浅克隆会使得原对象和克隆对象共享某些引用数据。

示例:浅克隆
class Person implements Cloneable {private String name;private int age;private Address address;public Person(String name, int age, Address address) {this.name = name;this.age = age;this.address = address;}public Object clone() throws CloneNotSupportedException {return super.clone(); // 使用 Object 类的 clone() 方法进行浅克隆}// Getter and Setter
}class Address {private String street;public Address(String street) {this.street = street;}// Getter and Setter
}

在上述示例中,Person类实现了 Cloneable 接口,并通过 super.clone() 实现了浅克隆。Personaddress 字段是一个引用类型,浅克隆后,原对象和克隆对象会共享同一个 Address 对象。

深克隆(Deep Copy)

深克隆是指复制对象时,不仅复制对象本身,还递归地复制对象中所有引用类型字段所指向的对象。这样,原对象和克隆对象就完全独立,互不干扰。

示例:深克隆
class Person implements Cloneable {private String name;private int age;private Address address;public Person(String name, int age, Address address) {this.name = name;this.age = age;this.address = address;}public Object clone() throws CloneNotSupportedException {// 深克隆:手动克隆 address 对象Person cloned = (Person) super.clone();cloned.address = (Address) address.clone();return cloned;}// Getter and Setter
}class Address implements Cloneable {private String street;public Address(String street) {this.street = street;}public Object clone() throws CloneNotSupportedException {return super.clone(); // 递归克隆地址对象}// Getter and Setter
}

在这个例子中,Person类通过手动克隆address对象实现了深克隆。原对象和克隆对象的address字段是独立的,即使修改一个对象的address,另一个对象的address也不会受到影响。

浅克隆与深克隆的区别

特性浅克隆(Shallow Copy)深克隆(Deep Copy)
复制对象仅复制对象的基本数据类型字段和引用类型字段的引用复制对象及其所有引用类型字段指向的对象
引用类型字段引用类型字段指向相同的对象引用类型字段指向独立的对象
性能较高,克隆操作较为简单较低,需递归克隆所有对象
适用场景当对象中没有嵌套引用类型,或者引用类型对象无需独立时当对象中包含嵌套引用类型,并且需要独立的对象时

原型模式的适用场景

原型模式适用于以下几种情况:

  1. 对象创建成本较高或复杂:当创建对象非常复杂或资源消耗较大时,可以通过克隆现有对象来节省时间和资源。

示例:当创建一个数据库连接对象时,通常建立连接需要很多时间和系统资源,而通过克隆一个已连接的对象来获得一个新的连接,效率会更高。

  1. 需要复制多个相似对象:当需要创建一批类似的对象时,通过复制现有的对象来避免重复的初始化过程。

示例:在图形设计软件中,可以复制一个已有的图形(如矩形、圆形等)来创建新图形,而不需要重新绘制。

  1. 需要变更部分属性:当对象的大部分属性保持不变时,可以通过克隆现有对象并修改部分属性来生成新的对象。

示例:在游戏中,玩家创建角色时,可以复制一个已有的角色模板,然后修改角色的一些属性(如装备、技能等)来快速创建新角色

相关文章:

原型模式(Prototype Pattern)——对象克隆、深克隆与浅克隆及适用场景

原型模式(Prototype Pattern)是设计模式中的一种创建型模式,目的是通过复制现有的对象来创建新的对象,而不是通过传统的实例化方式。原型模式常常用于需要创建大量类似对象的场景,可以提高性能并减少资源的消耗。下面将…...

从工标网网站解析标准信息

import requests from bs4 import BeautifulSoup 将标准搜索关键词转化成GBK格式,并用%连接转化后16进制,转化成工标网的查询网址url text “GB/T 9755” utf8_encoded_text text.encode(‘GBK’) #print(utf8_encoded_text) hex_representation ‘…...

如何在MySQL中开启死锁日志及查看日志

在数据库的多用户环境中,死锁是一个常见的问题,它可能会影响到数据库的性能和稳定性。MySQL提供了一些工具和命令来帮助我们识别和解决死锁问题。本文将介绍如何在MySQL中开启死锁日志以及如何查看这些日志。 一、为什么需要死锁日志 死锁是指两个或多…...

VCP-CLIP A visual context prompting modelfor zero-shot anomaly segmentation

GitHub - xiaozhen228/VCP-CLIP: (ECCV 2024) VCP-CLIP: A visual context prompting model for zero-shot anomaly segmentation 需要构建正样本,异常样本,以及对应的Mask...

分类算法中的样本不平衡问题及其解决方案

一、样本不平衡问题概述 在机器学习的分类任务中,样本不平衡是指不同类别训练样本数量存在显著差异的现象。这一差异会给模型训练和性能评估带来挑战,尤其在处理少数类样本时,模型可能难以有效学习其特征。 以二分类为例,理想情况…...

博物馆导览系统方案(一)背景需求分析与核心技术实现

维小帮提供多个场所的室内外导航导览方案,如需获取博物馆导览系统解决方案可前往文章最下方获取,如有项目合作及技术交流欢迎私信我们哦~撒花! 一、博物馆导览系统的背景与市场需求 在数字化转型的浪潮中,博物馆作为文化传承和知…...

[创业之路-169]:《BLM战略规划》- 战略洞察 (战略能力中最最核心的能力) - 市场洞察 -1- 看宏观/行业 - 行业:激光器行业的详细分析

目录 一、激光器行业的详细分析 1. 行业总容量分析 2. 行业成长性分析 3. 行业的供需结构 4. 行业的发展阶段与动态S曲线 5. 行业集中度 6. 关键成功因素 二、对深紫外激光器进行如下分析 1、行业总容量分析 2、行业成长性分析 3、行业的供需结构 4、行业的发展阶段…...

抽象工厂模式的理解和实践

在软件开发中,设计模式是解决常见问题的最佳实践。抽象工厂模式是一种创建型设计模式,提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。本文将详细解释抽象工厂模式的概念、结构、优点、缺点,并通过Java代…...

WIDER FACE数据集转YOLO格式

1. 引出问题 本人最近在做毕设相关内容,第一阶段目标是通过目标检测来统计课堂人数,因此需要对人脸和人头进行目标检测。模型方面没什么好说的无脑用YOLO,数据集方面,人脸部分找到了来自港中文的WIDER FACE数据集。但是解压后发现…...

项目启动的基本配置

开启驼峰命名 如果字段名与属性名符合驼峰命名规则,MyBatis会自动通过驼峰命名规则映射。 在application.yml配置文件中,可以添加以下配置来开启驼峰命名规则: mybatis:configuration:map-underscore-to-camel-case: true 这段配置的作用…...

Ubuntu桌面突然卡住,图形界面无反应

1.可能等待几分钟,系统会自动反应过来。你可以选择等待几分钟。 2.绝大多数情况系统是不会反应过来的,这时候可以进入tty终端直接注销用户。 (1)Ubuntu有6个tty终端,按住CtrlAltF1可以进入tty1终端,(同理CtrlAltF2&a…...

Next.js系统性教学:拦截路由与路由处理器

更多有关Next.js教程,请查阅: 【目录】Next.js 独立开发系列教程-CSDN博客 目录 1. 路由拦截 (Intercepting Routes) 1.1 什么是路由拦截? 1.2 配置拦截路由 1.3 示例:模态框预览 1.4 使用场景 2. 路由处理器 (Route Handl…...

Python编码风格

Python代码的常用排版格式主要遵循PEP 8规范,这是Python社区广泛接受的编码风格指南。以下是一些关键的排版格式要求: 一、缩进 使用4个空格作为缩进级别,不要使用Tab键,更不能混合使用Tab和空格。 二、行长度 每行代码的最大…...

flask创建templates目录存放html文件

首先,创建flask项目,在pycharm中File --> New Project,选择Flask项目。 然后,在某一目录下,新建名为templates的文件夹,这时会是一个普通的文件夹。 然后右击templates文件夹,选择Unmark as …...

微信小程序里的小游戏研发需要什么技术栈

研发小程序里的小游戏通常需要以下技术栈: 前端技术 HTML5 / CSS3:用于构建游戏的界面布局和样式。JavaScript:作为核心编程语言,实现游戏的逻辑和交互。小程序开发框架:如微信小程序的开发框架,了解其 API…...

2024年上半年网络工程师案例分析真题及答案解析

2024年上半年网络工程师案例分析真题及答案解析 1、试题一(20分) 阅读以下说明,回答问题。 [说明]某高校网络拓扑如下图所示,两校区核心(CORE-1,CORE-2),出口防火墙(NGFW-1,NGFW-2)通过校区间光缆互联,配置OSPF实现全校路由收效,校区相距40km。两校区默认由本地出…...

Ant Design Vue v4版本如何解决1px没有被postcss-px2rem转成rem的问题

背景说明 如果你的 Ant Design Vue 项目有要做适配的需求,那首先要选择一种适配方案。笔者选择的是用 postcss-px2rem 进行适配。笔者在配置了 postcss-px2rem的相关配置后,发现 postcss-px2rem 没有对 Ant Design Vue 进行适配。在网上看了一些文章之后…...

武汉科技大学《2024年814自动控制原理真题》 (完整版)

本文内容,全部选自自动化考研联盟的:《武汉科技大学814自控考研资料》的真题篇。后续会持续更新更多学校,更多年份的真题,记得关注哦~ 目录 2024年真题 Part1:2024年完整版真题 2024年真题...

【锂电池实战】A123磷酸铁锂在线参数识别-一阶戴维南模型

A123磷酸铁锂在线参数识别-一阶戴维南模型 提要 理论介绍:一篇就够了,为你答疑解惑:锂电池一阶模型-在线参数辨识(附代码)_在线参数辨识方法-CSDN博客 数据源:Battery Data | Center for Advanced Life Cycle Engineering 打包下载地址:A123-DST-US06-FUDS-25.zip资源…...

Java多线程与线程池技术详解(四)

接受失败:“失败是什么?没有什么,只是更走近成功一步;成功是什么?就是走过了所有通向失败的路,只剩下一条路,那就是成功的路。”这句话很好地诠释了如何看待失败的问题,即每一次跌倒…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...

深度学习水论文:mamba+图像增强

🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

快刀集(1): 一刀斩断视频片头广告

一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...

C++ 设计模式 《小明的奶茶加料风波》

👨‍🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...

Spring Security 认证流程——补充

一、认证流程概述 Spring Security 的认证流程基于 过滤器链(Filter Chain),核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤: 用户提交登录请求拦…...