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

创建型:原型模式

目录

1、核心思想

2、实现方式

2.1 基本结构

2.2 代码示例(Java)

3、适用场景

4、new与clone实际场景建议


1、核心思想

目的:通过复制(克隆)现有对象来创建新对象,而不是通过new关键字实例化。对于那些有非常复杂的初始化过程的对象或者是需要耗费大量资源的情况,原型模式是更好的选择。

核心价值:通过克隆避免重复初始化,提升性能。

克隆的优势:克隆操作时Java虚拟机会进行内存操作,直接拷贝原型对象数据流生成新的副本对象,绝不会拖泥带水地触发一些多余的复杂操作(如类加载、实例化、初始化等)​,所以其效率远远高于“new”关键字所触发的实例化操作。

注意

1> 浅拷贝与深拷贝

浅拷贝:复制原始类型的值,引用类型只拷贝地址引用(指针),与原对象的应用变量地址指向的内存对象是同一个。

深拷贝:需要在clone方法里,自行递归实现引用对象的clone和赋值,确保与原对象完全独立,注意这里的引用对象也需要实现Cloneable接口。递归赋值会大幅增加资源消耗。

2> 依赖 Cloneable 接口:若类未实现 Cloneable,调用 clone() 会抛出 CloneNotSupportedException。

性能对比

场景new 的消耗clone() 的消耗
简单对象(浅拷贝)较高(跳过构造函数)
复杂对象(深拷贝)可能更高(递归复制)

优缺点

优点缺点
避免重复初始化,提升性能深拷贝实现复杂(尤其循环引用时)
动态生成对象配置(修改原型即可)需为每个类实现克隆方法
隐藏对象创建细节,降低耦合度可能违背构造函数约束(如私有状态)

2、实现方式

2.1 基本结构

  • 抽象原型接口(Prototype):声明克隆方法(如 clone()),对应Cloneable接口。

  • 具体原型实现类(ConcretePrototype):实现克隆方法,定义如何复制自身,实现方法中调用super.clone()即可得到新的浅克隆的对象。

  • 客户端(Client):通过原型对象的 clone() 方法生成新对象。

2.2 代码示例(Java)

// 1. 抽象原型接口  Cloneable// 2. 具体原型类
public class ConcretePrototype implements Cloneable {private String field;private List<String> listField; // 引用类型字段private ObjectTmp objectTmp; // 引用类型字段,ObjectTmp类需要实现Cloneablepublic ConcretePrototype(String field, List<String> listField) {this.field = field;this.listField = listField;}publice void setListField(List<String> listField) {this.listField = listField;}publice void setObjectTmp(ObjectTmp objectTmp) {this.objectTmp= objectTmp;}@Overridepublic ConcretePrototype clone() {try {// 浅拷贝(直接复制引用)ConcretePrototype copy = (ConcretePrototype) super.clone();// 深拷贝(需手动复制引用类型字段)copy.setListField(new ArrayList<>(this.listField));copy.setObjectTmp(this.objectTmp.clone());return copy;} catch (CloneNotSupportedException e) {throw new AssertionError();}}
}// 3. 客户端使用
public class Client {public static void main(String[] args) {ConcretePrototype prototype = new ConcretePrototype("value", Arrays.asList("a", "b"));ConcretePrototype clone = (ConcretePrototype) prototype.clone();}
}

3、适用场景

  • 对象创建成本高:如需要复杂计算的配置对象。

  • 动态生成对象变体:例如游戏中生成不同属性的敌人。

  • 需要隔离对象状态:保证原对象与新对象互不影响。

  • 结合工厂模式使用:用原型注册表管理多种原型对象。

4、new与clone实际场景建议

  • 优先用 new

    • 代码更清晰,符合常规对象创建逻辑。

    • 避免深浅拷贝的潜在问题(如意外共享引用)。

  • 谨慎用 clone()

    • 仅在需要高效复制简单对象时使用(如缓存对象、原型模式)。

    • 确保正确实现 Cloneable 接口并处理深浅拷贝。

  • 替代方案

    • 工厂方法/构建器模式:灵活控制对象创建流程。

    • 序列化/反序列化:实现深拷贝,但性能较差。

public class DeepCopyUtil {public static <T extends Serializable> T deepCopy(T object) {try (ByteArrayOutputStream bos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(bos)) {oos.writeObject(object);try (ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());ObjectInputStream ois = new ObjectInputStream(bis)) {return (T) ois.readObject();}} catch (IOException | ClassNotFoundException e) {throw new RuntimeException("Deep copy failed", e);}}
}

相关文章:

创建型:原型模式

目录 1、核心思想 2、实现方式 2.1 基本结构 2.2 代码示例&#xff08;Java&#xff09; 3、适用场景 4、new与clone实际场景建议 1、核心思想 目的&#xff1a;通过复制&#xff08;克隆&#xff09;现有对象来创建新对象&#xff0c;而不是通过new关键字实例化。对于那…...

浅谈“量子计算应用:从基础原理到行业破局”

量子计算应用:从基础原理到行业破局 引言:量子计算为何成为科技革命新引擎? 量子计算利用量子力学原理(叠加态、纠缠态、量子干涉)突破经典计算的极限,在特定领域可实现指数级加速。根据中研普华预测,2025年全球量子计算市场规模将突破80亿美元,2035年可达8117亿美元。…...

Java面试攻略:从Spring Boot到微服务架构的深入探讨

Java面试攻略&#xff1a;从Spring Boot到微服务架构的深入探讨 场景设定 在一家知名互联网大厂的会议室里&#xff0c;资深面试官王老师正在对一位求职者谢飞机进行技术面试。谢飞机是一位幽默风趣的程序员&#xff0c;他的回答有时让人捧腹大笑。 第一轮&#xff1a;核心技…...

关于文件分片的介绍和应用

文件分片&#xff0c;顾名思义&#xff0c;就是将一个大文件分割成多个小的文件块&#xff08;chunk&#xff09;。每个文件块都是原始文件的一部分&#xff0c;并可以通过特定的方式将这些小文件块重新组装成原始文件。 1. 基本原理: 文件分片从底层来看&#xff0c;主要是对…...

Tapered Off-Policy REINFORCE_ 如何为LLM实现稳定高效的策略优化?

Tapered Off-Policy REINFORCE: 如何为LLM实现稳定高效的策略优化&#xff1f; 在大语言模型&#xff08;LLM&#xff09;的微调领域&#xff0c;强化学习&#xff08;RL&#xff09;正成为提升复杂任务性能的核心方法。本文聚焦于一篇突破性论文&#xff0c;其提出的Tapered …...

使用lvm进行磁盘分区

使用lvm进行磁盘分区 目的&#xff1a; 使用/dev/vdb创建一个5g的逻辑卷挂载到/mnt/lvmtest 前提&#xff1a; /dev/vdb是一块干净的空磁盘&#xff0c;数据会被清空&#xff01;&#xff01;&#xff01; 1. 创建物理卷(PV)&#xff1a; pvcreate /dev/sdb2. 验证&#xf…...

[Java实战]Spring Boot整合Elasticsearch(二十六)

[Java实战]Spring Boot整合Elasticsearch&#xff08;二十六&#xff09; 摘要&#xff1a;本文通过完整的实战演示&#xff0c;详细讲解如何在Spring Boot项目中整合Elasticsearch&#xff0c;实现数据的存储、检索和复杂查询功能。包含版本适配方案、Spring Data Elasticsea…...

图像分割(1)U-net

一、整体结构 虽然说是几年前的产品&#xff0c;但是现在还在用&#xff0c;因为深度学习很多时候越是简单的网络用起来效果越好&#xff0c;而且一般是目标比较小的时候产生的分割问题。u-net的优势就是网络结构简单&#xff0c;适合小目标分割&#xff0c;所以一直用到现在&a…...

数位和:从定义到编程实现

1. 定义 ​数位和​&#xff08;Digit Sum&#xff09;是指一个数的每一位数字相加的总和。例如&#xff1a; 123 的数位和&#xff1a;1 2 3 645 的数位和&#xff1a;4 5 9 2. 计算方法 计算数位和的通用步骤&#xff1a; ​提取每一位数字​&#xff1a;从右到左&…...

2025抓包工具Reqable手机抓包HTTPS亲测简单好用-快速跑通

前言 自安卓7.0高版本系统不在信任用户证书&#xff0c;https抓包方式市面查找方法太过复杂手机要root等&#xff0c;前置条件要求太高太复杂&#xff0c;看的头痛&#xff0c;今天一台电脑按步骤操作完即可抓包https,给大家搞定抓包https问题。支持直接编辑修改请求参…...

使用 Auto-Keras 进行自动化机器学习

使用 Auto-Keras 进行自动化机器学习 了解自动化机器学习以及如何使用 auto-keras 完成它。如今&#xff0c;机器学习并不是一个非常罕见的术语&#xff0c;因为像 DataCamp、Coursera、Udacity 等组织一直在努力提高他们的效率和灵活性&#xff0c;以便将机器学习的教育带给普…...

python 自动化教程

文章目录 前言整数变量​字符串变量​列表变量​算术操作​比较操作​逻辑操作​if语句​for循环遍历列表​while循环​定义函数​调用函数​导入模块​使用模块中的函数​启动Chrome浏览器​打开网页​定位元素并输入内容​提交表单​关闭浏览器​发送GET请求获取网页内容​使…...

简单使用Slidev和PPTist

简单使用Slidev和PPTist 1 简介 前端PPT制作有很多优秀的工具包&#xff0c;例如&#xff1a;Slidev、revealjs、PPTist等&#xff0c;Slidev对Markdown格式支持较好&#xff0c;适合与大模型结合使用&#xff0c;选哟二次封装&#xff1b;revealjs适合做数据切换&#xff0c…...

RISC-V 开发板 MUSE Pi Pro V2D图像加速器测试,踩坑介绍

视频讲解&#xff1a; RISC-V 开发板 MUSE Pi Pro V2D图像加速器测试&#xff0c;踩坑介绍 今天测试下V2D&#xff0c;这是K1特有的硬件级别的2D图像加速器&#xff0c;参考如下文档&#xff0c;但文档中描述的部分有不少问题&#xff0c;后面会讲下 https://bianbu-linux.spa…...

人工智能100问☞第26问:什么是贝叶斯网络?

贝叶斯网络是基于有向无环图和条件概率表构建的概率图模型,用于表达变量间的条件依赖关系并进行不确定性推理。 一、通俗解释 想象你玩侦探游戏,要通过零散线索推理真相。贝叶斯网络就像一张"因果关系地图"——用箭头把事件连起来,并标注每个事件发生的概率。比…...

c++多线程debug

debug demo 命令行查看 ps -eLf|grep cam_det //查看当前运行的轻量级进程 ps -aux | grep 执行文件 //查看当前运行的进程 ps -aL | grep 执行文件 //查看当前运行的轻量级进程 pstree -p 主线程ID //查看主线程和新线程的关系 查看线程栈结构 pstack 线程ID 步骤&…...

如何畅通需求收集渠道,获取用户反馈?

要畅通需求收集渠道、有效获取用户反馈&#xff0c;核心在于多样化反馈入口、闭环反馈机制、用户分层管理、反馈数据结构化分析等四个方面。其中&#xff0c;多样化反馈入口至关重要&#xff0c;不同用户有不同的沟通偏好&#xff0c;只有覆盖多个反馈路径&#xff0c;才能捕捉…...

标准库、HAl库和LL库(PC13初始化)

标准库 (Standard Peripheral Library) c #include "stm32f10x.h"void GPIO_Init_PC13(void) {GPIO_InitTypeDef GPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);GPIO_InitStruct.GPIO_Pin GPIO_Pin_13;GPIO_InitStruct.GPIO_Mode GPIO_…...

LangGraph深度解析:构建持久化、可观测的智能体工作流

一、项目概述与技术定位 1.1 LangGraph核心价值 LangGraph是由LangChain团队推出的开源框架(GitHub仓库:https://github.com/langchain-ai/langgraph),专为构建持久化、状态化的智能体工作流设计。作为LangChain生态系统的战略补充,它解决了传统LLM应用在以下方面的关键…...

设备预测性维护的停机时间革命:中讯烛龙如何用AI重构工业设备管理范式

在工业4.0的智能化浪潮中&#xff0c;非计划停机每年吞噬企业3%-8%的产值。中讯烛龙预测性维护系统通过多模态感知矩阵分布式智能体的创新架构&#xff0c;实现设备健康管理的范式跃迁&#xff0c;帮助制造企业将停机时间压缩70%以上。本文将深度解析技术实现路径与行业级实践方…...

day29 python深入探索类装饰器

目录 一、类装饰器的初步理解 二、类装饰器与函数装饰器的对比 三、类装饰器的实现与应用 &#xff08;一&#xff09;为类添加日志功能 &#xff08;二&#xff09;动态方法绑定的两种方式 四、手动调用装饰器&#xff1a;类的“后天改造” 五、总结与展望 一、类装饰器…...

Python数据分析三剑客:NumPy、Pandas与Matplotlib安装指南与实战入门

Python数据分析三剑客&#xff1a;NumPy、Pandas与Matplotlib安装指南与实战入门 1. 引言 Python数据分析生态&#xff1a;NumPy、Pandas、Matplotlib是数据科学领域的核心工具链。适用场景&#xff1a;数值计算、数据处理、可视化分析&#xff08;如金融分析、机器学习、科研…...

二:操作系统之进程控制块(PCB)

进程的身份证与状态记录&#xff1a;深入理解进程控制块 (PCB) 在我们之前的博客中&#xff0c;我们探讨了进程是什么——程序的一次执行实例&#xff0c;以及进程在其生命周期中会经历的各种状态&#xff08;新建、就绪、运行、等待、终止&#xff09;。我们知道&#xff0c;…...

Spring-Beans的生命周期的介绍

目录 1、Spring核心组件 2、Bean组件 2.1、Bean的定义 2.2、Bean的生命周期 1、实例化 2、属性填充 3、初始化 4、销毁 2.3、Bean的执行时间 2.4、Bean的作用域 3、常见问题解决方案 4、与Java对象区别 前言 关于bean的生命周期&#xff0c;如下所示&#xff1a; …...

Android 自定义悬浮拖动吸附按钮

一个悬浮的拨打电话按钮&#xff0c;使用CardViewImageView可能会出现适配问题&#xff0c;也就是图片显示不全&#xff0c;出现这种问题&#xff0c;就直接替换控件了&#xff0c;因为上述的组合控件没有FloatingActionButton使用方便&#xff0c;还可以有拖动和吸附效果不是更…...

通过串口设备的VID PID动态获取串口号(C# C++)

摘要 本篇文章主要介绍分别通过C#和C++使用设备VID PID如何动态获取COM口 目录 1 简述 2 VID PID查看方式 3 C#实现通过串口设备的VID PID动态获取串口号 3.1 辅助类实现 3.2 调用实例 4 C++实现通过串口设备的VID PID动态获取串口号 4.1 辅助类实现 4.2 调用实例 1 简…...

[创业之路-361]:企业战略管理案例分析-2-战略制定-使命、愿景、价值观的失败案例

一、失败案例 1、使命方面的失败案例 真功夫创业者内乱&#xff1a;真功夫在创业过程中&#xff0c;由于股权结构不合理&#xff0c;共同创始人及公司大股东潘宇海与实际控制人、董事长蔡达标产生管理权矛盾。双方在公司发展方向、管理改革等方面无法达成一致&#xff0c;导致…...

Window远程连接Linux桌面版

Window远程连接Linux桌面版 卸载RealVNC Server 一、确认是否安装了 VNC Server 先检查是否已安装&#xff1a; which vncserver # 或 dpkg -l | grep vnc # 或 rpm -qa | grep vnc二、在 Debian / Ubuntu 上卸载&#xff08;.deb 安装&#xff09; 1. 卸载 RealVNC Serve…...

一种开源的高斯泼溅实现库——gsplat: An Open-Source Library for Gaussian Splatting

一种开源的高斯泼溅实现库——gsplat: An Open-Source Library for Gaussian Splatting 文章目录 一种开源的高斯泼溅实现库——gsplat: An Open-Source Library for Gaussian Splatting摘要Abstract1. 基本思想1.1 设计1.2 特点 2. Nerfstudio&Splatfacto2.1 Nerfstudio2.…...

ARM A64 STR指令

ARM A64 STR指令 1 STR (immediate)1.1 Post-index1.1.1 32-bit variant1.1.2 64-bit variant 1.2 Pre-index1.2.1 32-bit variant1.2.2 64-bit variant 1.3 Unsigned offset1.3.1 32-bit variant1.3.2 64-bit variant 1.4 Assembler symbols 2 STR (register)2.1 32-bit varia…...