【设计模式】原型模式详解

概述

用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象

结构
  • 抽象原型类:规定了具体原型对象必须实现的clone()方法
  • 具体原型类:实现抽象原型类的clone()方法,它是可以被复制的对象。
  • 访问类:使用原型类中的clone()方法来复制新的对象
分类
  • 浅克隆(也就是浅拷贝):创建一个新的对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原油属性所指向的内存地址。(原型模式)
  • 深克隆(也就是深拷贝):创建一个新对象,属性引用的其他对象也会被克隆,不再指向原有对象地址。 (扩展)

Java中的Object类中提供了clone()方法来实现浅克隆。Cloneable是实现浅克隆的接口

使用场景
  • 对象的创建非常复杂,可以使用原型模式快捷的创建对象。
  • 性能的安全要求比较高。

深克隆

需要用序列化和反序列化来操作

import java.util.ArrayList;class Person implements Cloneable {private String name;private ArrayList<String> hobbies;public Person(String name) {this.name = name;this.hobbies = new ArrayList<>();}public void addHobby(String hobby) {this.hobbies.add(hobby);}public String getName() {return this.name;}// 新增深复制getHobbies方法public ArrayList<String> getDeepCopyOfHobbies() {return new ArrayList<>(this.hobbies);}// 重写clone方法以实现深复制@Overrideprotected Object clone() throws CloneNotSupportedException {Person clonedPerson = (Person) super.clone();// 对引用类型的hobbies进行深复制clonedPerson.hobbies = new ArrayList<>(this.hobbies);return clonedPerson;}public static void main(String[] args) throws CloneNotSupportedException {Person person1 = new Person("Alice");person1.addHobby("Reading");// 使用clone方法创建深复制对象Person person2 = (Person) person1.clone();person2.getName();  // 输出"Alice"person2.getHobbies().add("Swimming");  // 修改person2的爱好// 由于进行了深复制,所以person1和person2的hobbies引用不同的对象System.out.println(person1.getHobbies());  // 输出[Reading]System.out.println(person2.getHobbies());  // 输出[Reading, Swimming]}
}

以上代码展示了Java中实现原型模式的基本结构。通过clone()方法,我们可以创建一个与原始对象具有相同状态的新对象,这在某些场景下可以显著提高对象创建的效率,尤其是当初始化成本较高的时候。注意这里的clone()方法使用了序列化的方式来实现深复制,确保复制出的对象与原对象内容相同但内存空间独立。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/777909.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot 单元测试 0基础教程

咱们以一种通俗易懂的方式&#xff0c;通过一个简单的实例来教你怎么在Spring Boot项目中进行单元测试。 假设你有一个简单的Spring Boot应用&#xff0c;里面有一个UserService接口&#xff0c;以及它的实现类 UserServiceImpl&#xff0c;这个服务有一个方法用来获取用户的问…

数据库原理与应用(SQL Server)笔记 关系数据库

目录 一、关系数据库的基本概念&#xff08;一&#xff09;关系数据库的定义&#xff08;二&#xff09;基本表、视图&#xff08;三&#xff09;元组、属性、域&#xff08;四&#xff09;候选码、主码、外码 二、关系模型三、关系的完整性&#xff08;一&#xff09;实体完整…

010——服务器开发环境搭建及开发方法(下)

目录 三、 第一个驱动程序 四、 buildroot 4.1 制作根文件系统 4.2 buildroot使用 五、 uboot 009——服务器开发环境搭建及开发方法&#xff08;上&#xff09;-CSDN博客 三、 第一个驱动程序 # 1. 使用不同的开发板内核时, 一定要修改KERN_DIR # 2. KERN_DIR中的内核要…

机器学习和神经网络9

通过前几次学习,相信对机器学习和神经网络已经有了较为深入的了解。 让我们从一些经典的机器学习算法和实际代码示例开始。: 线性回归:用于预测连续输出的基本算法。你可以从这里找到详细的原理和代码示例。 K-近邻算法 (k-Nearest Neighbors, kNN):一种简单但有效的分类和…

百度智能云推出AI大模型全家桶;抖音发布 AI 生成虚拟人物治理公告

百度智能云推出大模型全家桶 百度智能云昨日在北京首钢园召开「Al Cloud Day: 大模型应用产品发布会」&#xff0c;此次发布会上&#xff0c;百度智能云宣布对以下 7 款产品进行升级。 数字人平台百度智能云曦灵智能客服平台百度智能云客悦内容创作平台「一念」知识智平台「甄…

npm淘宝镜像源切换

查询 npm config get registry注意因为淘宝的镜像域名更换&#xff0c;https://registry.npm.taobao.org域名HTTPS证书到期更换为https://registry.npmmirror.com/ 切换 npm config set registry https://registry.npmmirror.com/

ubuntu16 apt安装程序锁死解决

目录 1.使用apt install安装程序有时会爆出dpkg/lock类故障 2.使用lsof命令查看占用锁的进程 3.使用kill -9命令删除占用进程 4.删除锁 5. 配置生效 1.使用apt install安装程序有时会爆出dpkg/lock类故障 E: Could not get lock /var/lib/dpkg/lock - open (11: Resource …

【计算机网络】第 11、12 问:流量控制和可靠传输机制有哪些?

目录 正文流量控制的基本方法停止-等待流量控制基本原理滑动窗口流量控制基本原理 可靠传输机制1. 停止-等待协议2. 后退 N 帧协议&#xff08;GBN&#xff09;3. 选择重传协议&#xff08;SR&#xff09; 正文 流量控制涉及对链路上的帧的发送速率的控制&#xff0c;以使接收…

机器学习和神经网络0

神经网络及其在人工智能领域的应用 神经网络是一种模仿人脑神经元网络结构和功能的计算模型&#xff0c;它能够通过学习和识别数据模式来执行各种复杂任务。自20世纪40年代首次提出以来&#xff0c;神经网络已经在机器学习和人工智能领域取得了显著的进展。本文将探讨神经网络…

设计模式学习笔记 - 设计模式与范式 -结构型:5.门面模式:兼顾接口的通用性和易用性

概述 前面我们学习了代理模式、桥接模式、装饰器模式、适配器模式&#xff0c;本章再来学习一个新的结构性模式&#xff1a;门面模式。门面模式原理和实现都特别简单&#xff0c;应用场景也比较明确&#xff0c;主要在接口设计方面使用。 不知道你有没有遇到关于接口粒度的问…

HTTP

HTTP 概念&#xff1a;HyperTextTransferProtocol&#xff0c;超文本传输协议&#xff0c;规定了浏览器和服务器之间数据传输的规则 HTTP协议特点&#xff1a; 1.基于TCP协议&#xff1a;面向连接&#xff0c;安全 2.基于请求-响应模型的&#xff1a;一次请求对应一次响应 …

区块链dapp开发 dapp系统开发方案

在区块链技术的兴起和普及的推动下&#xff0c;去中心化应用程序&#xff08;DApp&#xff09;成为了当前数字世界中的热门话题之一。DApp 的开发不仅需要考虑技术方面的挑战&#xff0c;还需要深入了解区块链的工作原理和应用场景。本文将介绍一种 DApp 系统开发的基本方案&am…

CSS实现小车旅行动画实现

小车旅行动画实现 效果展示 CSS 知识点 灵活使用 background 属性下的 repeating-linear-gradient 实现路面效果灵活运用 animation 属性与 transform 实现小车和其他元素的动画效果 动画场景分析 从效果图可以看出需要实现此动画的话&#xff0c;需要position属性控制元素…

旧电脑安装个Win11玩玩,看看体验如何!

前言 小伙伴们都很清楚&#xff0c;Windows11的配置要求其实并不是很高&#xff0c;但要求的受信任平台模块&#xff08;TPM&#xff09;版本要求2.0 由于受信任平台模块的限制&#xff0c;导致许多电脑都没办法安装Windows11&#xff0c;如果要安装Windows11的旧机器也只能绕…

【QT+QGIS跨平台编译】040:【geos_c+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

点击查看专栏目录 文章目录 一、geos_c介绍二、文件下载三、文件分析四、pro文件五、编译实践一、geos_c介绍 GEOS_C(GEOS C++接口)是GEOS库的C语言版本,它提供了一套丰富的API,允许开发者在C++程序中执行复杂的几何形状处理和空间关系分析。GEOS_C是基于JTS(Java Topolog…

怎么判断k8s的master是否支持调度运行pod服务

要查看 Kubernetes 中的污点&#xff08;Taint&#xff09;配置&#xff0c;您可以使用以下命令&#xff1a; kubectl describe node <节点名称> 这将显示有关节点的详细信息&#xff0c;其中包括节点上设置的污点。您还可以使用以下命令来获取节点的污点信息&#xff1a…

ADB的主要操作命令及详解

ADB&#xff0c;全称Android Debug Bridge&#xff0c;即安卓调试桥&#xff0c;是一个通用的命令行工具&#xff0c;其允许你与模拟器实例或连接的安卓设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试应用&#xff0c;并提供对Unix shell&#xff08;可用来…

步态采集平台

&#x1f349;步骤一、读取视频每一帧图像 &#x1f349;步骤二、对读取的图像进行分割&#xff0c;得到全景下的步态轮廓图。 ​​​​​​​&#x1f349;步骤三、对读取的图像进行裁剪得到归一化的步态轮廓图。 ​​​​​​​&#x1f349;步骤四、保存这一帧步态轮廓图

新网站收录时间是多久,新建网站多久被百度收录

对于新建的网站而言&#xff0c;被搜索引擎收录是非常重要的一步&#xff0c;它标志着网站的正式上线和对外开放。然而&#xff0c;新网站被搜索引擎收录需要一定的时间&#xff0c;而且时间长短受多种因素影响。本文将探讨新网站收录需要多长时间&#xff0c;以及新建网站多久…

SnapGene 5 for Mac 分子生物学软件

SnapGene 5 for Mac是一款专为Mac操作系统设计的分子生物学软件&#xff0c;以其强大的功能和用户友好的界面&#xff0c;为科研人员提供了高效、便捷的基因克隆和分子实验设计体验。 软件下载&#xff1a;SnapGene 5 for Mac v5.3.1中文激活版 这款软件支持DNA构建和克隆设计&…