05.原型模式:从影分身术到细胞分裂的编程艺术

目录

    • 序幕:当复制对象成为战略需求
    • 一、原型工厂的核心装备库
      • 1.1 Java原生的浅克隆术
    • 二、深度克隆的炼金法则
      • 2.1 手工克隆大法(硬核派)
      • 2.2 序列化克隆术(魔法派)
    • 三、原型模式的工业级装配
      • 3.1 原型注册管理局
      • 3.2 Spring框架中的原型容器
    • 四、原型模式的性能实验室
      • 4.1 克隆 vs New性能对决
    • 五、原型模式三十六计
      • 5.1 浅克隆适用场景
      • 5.2 深克隆必备场景
      • 5.3 模式选择决策树
    • 终章:复制之术的哲学思考

序幕:当复制对象成为战略需求

🎮 游戏开发现场
你需要快速生成1000个外形相同但位置不同的敌人,直接new对象导致内存飙升?文档编辑器需要支持"无限撤销"功能,如何保存编辑状态的每一帧?这些场景都需要深谙"复制之道"的原型模式来破局!


一、原型工厂的核心装备库

1.1 Java原生的浅克隆术

// 基础忍者原型
public class Ninja implements Cloneable {private String name;private Weapon weapon; // 引用对象共享public Ninja(String name, Weapon weapon) {this.name = name;this.weapon = weapon;}@Overridepublic Ninja clone() {try {return (Ninja) super.clone(); // 浅克隆} catch (CloneNotSupportedException e) {throw new AssertionError();}}
}// 测试影分身效果
Ninji naruto = new Ninja("鸣人", new Kunai());
Ninja shadowClone = naruto.clone();System.out.println(naruto == shadowClone); // false
System.out.println(naruto.weapon == shadowClone.weapon); // true ❗

浅克隆缺陷警告

  • 引用类型共享导致意外修改
  • 嵌套对象无法实现真正隔离
  • 需要人工递归克隆对象树

二、深度克隆的炼金法则

2.1 手工克隆大法(硬核派)

// 深克隆示例
public class DeepNinja implements Cloneable {private String name;private Weapon weapon;@Overridepublic DeepNinja clone() {DeepNinja clone = (DeepNinja) super.clone();clone.weapon = this.weapon.clone(); // 武器也要克隆return clone;}
}// 武器类的克隆支持
public class Weapon implements Cloneable {private String type;@Overridepublic Weapon clone() {try {return (Weapon) super.clone();} catch (CloneNotSupportedException e) {throw new AssertionError();}}
}

2.2 序列化克隆术(魔法派)

// 基于序列化的深克隆工具
public class CloneUtils {@SuppressWarnings("unchecked")public static <T extends Serializable> T deepClone(T obj) {try (ByteArrayOutputStream bos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(bos)) {oos.writeObject(obj);try (ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());ObjectInputStream ois = new ObjectInputStream(bis)) {return (T) ois.readObject();}} catch (IOException | ClassNotFoundException e) {throw new RuntimeException("克隆失败", e);}}
}// 测试魔法克隆
Ninja sasuke = new Ninja("佐助", new Sword());
Ninja cloneArmy = CloneUtils.deepClone(sasuke); 

三、原型模式的工业级装配

3.1 原型注册管理局

// 原型管理器
public class PrototypeRegistry {private static Map<String, Ninja> prototypes = new HashMap<>();static {prototypes.put("naruto", new Ninja("鸣人", new Rasengan()));prototypes.put("sakura", new Ninja("小樱", new MedicalSeal()));}public static Ninja getClone(String key) {return prototypes.get(key).clone();}public static void addPrototype(String key, Ninja ninja) {prototypes.put(key, ninja);}
}// 快速生成克隆军团
Ninja army1 = PrototypeRegistry.getClone("naruto");
Ninja army2 = PrototypeRegistry.getClone("sakura");

3.2 Spring框架中的原型容器

// 原型Bean定义
@Component
@Scope(scopeName = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class ReportPrototype {private byte[] content;public void loadData(File file) {// 加载大文件到内存...}
}// 使用时获取新实例
public class ReportService {@Autowiredprivate ApplicationContext context;public void generateReport() {ReportPrototype report = context.getBean(ReportPrototype.class);report.loadData(new File("data.xlsx"));// 使用完自动回收...}
}

四、原型模式的性能实验室

4.1 克隆 vs New性能对决

// 测试代码框架
long start = System.nanoTime();
for (int i = 0; i < 10000; i++) {// 方案A: new Ninja(...)// 方案B: prototype.clone()
}
long duration = System.nanoTime() - start;

测试结果对比(复杂对象创建场景):

操作方式耗时(纳秒)内存占用(MB)
new352,000145
clone78,00062

结论

  • 对象构造越复杂,克隆优势越明显
  • 简单对象反而可能new更快

五、原型模式三十六计

5.1 浅克隆适用场景

  • 需要轻量级对象复制
  • 确定所有引用都是不可变对象
  • 需要与原型共享某些状态

5.2 深克隆必备场景

  • 原型包含可变引用对象
  • 需要完全隔离副本与原型
  • 原型中存在集合或嵌套结构

5.3 模式选择决策树

Yes
No
Yes
Yes
No
需要创建对象副本?
对象是否包含可变引用?
使用浅克隆
使用深克隆
确认是否接受引用共享
完成

终章:复制之术的哲学思考

设计启示

  1. 克隆不是银弹,要评估对象复杂度
  2. 深克隆可能引发"递归地狱"陷阱
  3. 原型注册表可以成为系统单点故障

性能警钟

// 错误!每次深克隆大文件对象
public class ReportService {private Report hugeReport; // 100MB的报表对象public Report createReport() {return CloneUtils.deepClone(hugeReport); // 灾难性性能!}
}

专家挑战
当你的原型对象包含网络连接(Socket)这类不可序列化的资源时,如何实现安全的深克隆?把你的解决方案写在评论区!

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

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

相关文章

[NLP]如何在 Synopsys VCS 仿真脚本中处理多个 UPF 文件的加载

如何在 Synopsys VCS 仿真脚本中处理多个 UPF 文件的加载 摘要:我将详细解释在 Synopsys VCS(VCS)模拟脚本中如何处理多个 UPF 文件的加载,包括原理、命令选项、示例脚本以及注意事项。这基于 VCS 的 native low power verification 支持(IEEE 1801 UPF 标准)。如…

DNF: Decouple and Feedback Network for Seeing in the Dark

DNF&#xff1a;用于暗光视觉的解耦与反馈网络 摘要 RAW 数据的独特属性在低光照图像增强方面展现出巨大潜力。然而&#xff0c;现有架构在单阶段和多阶段方法中的固有局限性限制了其性能。跨两个不同域&#xff08;噪声到干净和 RAW 到 sRGB&#xff09;的混合映射&#xff0c…

论文精读《Frequency domain watermarking: An overview》

1. 数字水印技术基础概念与发展背景 数字水印技术作为信息隐藏领域的核心分支,其发展历程可以追溯到20世纪90年代中期计算机网络和信息技术的快速发展时期。随着大量版权作品以数字文件形式存在,电子出版逐渐普及,传统的版权保护方法面临前所未有的挑战。数字水印技术应运而…

北斗短报文兜底、5G-A增强:AORO P1100三防平板构建应急通信网络

公网中断的灾区现场&#xff0c;泥石流阻断了最后一条光缆。一支救援队却在废墟间有序穿行&#xff0c;队长手中的三防平板正闪烁着北斗卫星信号&#xff0c;定位坐标与伤亡信息化作一行行短报文&#xff0c;穿透通信孤岛直达指挥中心。这是AORO P1100三防平板搭载的北斗短报文…

Java排序算法之<冒泡排序>

目录 1、冒泡排序介绍 2、算法步骤 3、Java 实现&#xff08;带优化&#xff09; 4、算法复杂度分析 5、优点与缺点 前言 排序算法的“进化路线”&#xff1a; 冒泡排序 → 选择排序 → 插入排序 → 希尔排序 → 快速排序 → 归并排序 → 堆排序↓Java 内置排序&#xff…

生活毫无头绪就毫无头绪吧(7.24)

最近好长一段时间没有记录了明显感觉自己陷入了混乱中作息规律&#xff0c;专注力&#xff0c;心流&#xff0c;营养的饭菜如今下笔也没有什么头绪&#xff0c;前些日子本有感想但是又疲于记录&#xff0c;忘了许许多多最近在写论文&#xff0c;但尝试了游泳——蛙泳感觉太神奇…

vulhub-master 靶场Apache(httpd)漏洞

apache_parsing_vulnerability 漏洞原理在Apache1.x/2.x中Apache 解析⽂件的规则是从右到左开始判断解析,如果后缀名为不可识别⽂件解析,就再往左判断。如 1.php.xxxxx&#xff0c;Apache会试图识别你的代码&#xff0c;从右往左一个一个试。漏洞攻略参加一个1.php.jpg文件&…

Python 数据分析(一):NumPy 基础知识

目录 1. 简介2. 使用 2.1 ndarray2.2 数据类型2.3 索引与切片2.4 副本与视图2.5 轴的概念2.6 基本运算2.7 常用操作 1. 简介 NumPy&#xff08;Numerical Python&#xff09;是一个开源的 Python 科学计算扩展库&#xff0c;主要用来处理任意维度数组与矩阵&#xff0c;通常…

编程与数学 03-002 计算机网络 04_数据链路层功能

编程与数学 03-002 计算机网络 04_数据链路层功能一、数据链路层的基本任务&#xff08;一&#xff09;封装成帧&#xff08;二&#xff09;差错控制&#xff08;三&#xff09;流量控制二、差错检测与纠正方法&#xff08;一&#xff09;常用的差错检测码&#xff08;二&#…

latex中既控制列内容位置又控制列宽,使用>{\centering\arraybackslash}p{0.85cm}

示例&#xff1a;\usepackage{array} % 为 >{...} 修饰符提供支持\begin{table*}[ht!]\centering \begin{tabular}{p{2.8cm} >{\centering\arraybackslash}p{0.85cm} >{\centering\arraybackslash}p{0.85cm} >{\centering\arraybackslash}p{0.85cm} >{\ce…

医疗数据挖掘Python机器学习案例

1. 医疗数据挖掘概述 医疗数据挖掘是从大量的医疗数据中提取有价值信息和知识的过程&#xff0c;旨在辅助医疗决策、疾病预测、治疗方案优化等。随着医疗信息化的发展&#xff0c;电子病历、医疗影像、基因数据等多源异构数据不断积累&#xff0c;为医疗数据挖掘提供了丰富的素…

人工智能概述

&#x1f31f; 欢迎来到AI奇妙世界&#xff01; &#x1f31f; 亲爱的开发者朋友们&#xff0c;大家好&#xff01;&#x1f44b; 我是人工智能领域的探索者与分享者&#xff0c;很高兴在CSDN与你们相遇&#xff01;&#x1f389; 在这里&#xff0c;我将持续输出AI前沿技术、实…

C++性能优化擂台技术文章大纲

引言性能优化在C开发中的重要性擂台赛形式的优势&#xff1a;激发创意&#xff0c;展示不同优化技巧目标读者&#xff1a;中高级C开发者擂台赛规则设计统一基准测试环境&#xff08;硬件、编译器、优化标志&#xff09;参赛代码需通过功能正确性验证性能指标&#xff1a;执行时…

AI人工智能时代,Bard的智能家政服务助手

AI人工智能时代,Bard的智能家政服务助手 关键词:人工智能、智能家居、Bard助手、机器学习、自然语言处理、物联网、智能服务 摘要:本文深入探讨了AI人工智能时代下,基于Bard技术的智能家政服务助手的实现原理、技术架构和应用场景。我们将从核心技术入手,分析其背后的机器…

MySQL(155)什么是MySQL的事件调度器?

MySQL的事件调度器&#xff08;Event Scheduler&#xff09;是一种强大的工具&#xff0c;用于在指定的时间间隔或特定时间点自动执行SQL语句。它类似于操作系统中的任务计划程序或Cron作业&#xff0c;适用于需要定时执行的任务&#xff0c;如数据归档、定期报告生成、定时清理…

【Zephyr开发实践系列】09_LittleFs文件系统操作

文章目录前言编写目的术语和缩写词方案选择一、Littlefs介绍二、Littlefs搭建步骤1.设备树构建2.自动挂载流程&#xff08;二选一&#xff09;2.1设备树启用自动挂载2.2 在 littlefs_fs.c 中&#xff0c;设备树宏会被展开2.3 模块注册初始化2.4 初始化阶段2.4.1注册Littlefs文件…

保护板测试仪:守护电池安全的“幕后卫士”

在现代科技飞速发展的今天&#xff0c;电池作为各类电子设备和新能源系统的核心动力源&#xff0c;其安全性与稳定性直接关系到设备的正常运行和使用者的安全。而保护板作为电池的“安全卫士”&#xff0c;承担着过充保护、过放保护、短路保护等关键功能。保护板测试仪则是专门…

【unitrix】 6.11 二进制数字标准化模块(normalize.rs)

一、源码 这个模块实现了类型级别的二进制数标准化处理&#xff0c;确保二进制数在组合时保持最简形式。 //! 二进制数字标准化模块 //! //! 提供二进制数字(B<H, L>)的组合前标准化功能&#xff0c;确保数字以最简形式表示&#xff0c; //! 避免同一数值有不同表示形式。…

解决OpenHarmony中找不到pthread_cancel和pthread_setcanceltype等libc符号的问题

笔者在移植三方库到OpenHarmony时遇到了pthread_cancel和pthread_setcanceltype函数找不到的问题&#xff0c;将解决办法分享如下&#xff1a; OpenHarmony的使用的c库musl中注释了这些函数的导出&#xff0c;在third_party/musl/libc.map.txt将屏蔽的函数中取消注释即可

Python编程进阶知识之第五课处理数据(matplotlib)

简介matplotlib 是 Python 中最流行的数据可视化库之一&#xff0c;它可以创建各种高质量的图表。无论是简单的折线图&#xff0c;还是复杂的 3D 图形&#xff0c;matplotlib 都能轻松应对。它提供了类似 MATLAB 的绘图接口&#xff0c;使得用户可以非常方便地进行图表的创建和…