java23种设计模式-原型模式

devtools/2025/2/25 6:11:36/

原型模式(Prototype Pattern)学习笔记

🌟 定义

原型模式属于创建型设计模式,通过复制现有对象(原型)来创建新对象,避免重复进行初始化操作。该模式的核心是实现对象的克隆能力。


🎯 适用场景

  1. 对象创建成本较高(如数据库连接、复杂计算后的对象)
  2. 需要避免重复初始化复杂对象
  3. 需要动态配置对象的生成参数
  4. 需要保存对象状态快照
  5. 需要隔离对象创建与使用(如对象池技术)

🔧 模式结构

📐 类图

Client
«interface»
Prototype
+clone() : Prototype
ConcretePrototype
-field1: String
-field2: int
+clone() : Prototype

🛠️ 核心组成

  1. Prototype(抽象原型接口)

    • 声明克隆方法的接口(通常为clone())
  2. ConcretePrototype(具体原型类)

    • 实现克隆方法的具体类
    • 可包含成员变量的深度复制逻辑
  3. Client(客户端)

    • 通过调用原型对象的克隆方法创建新对象

📝 代码示例

基础实现(浅拷贝)

// 1. 实现Cloneable接口
class Resume implements Cloneable {private String name;private int age;private WorkExperience work;public Resume(String name, int age) {this.name = name;this.age = age;this.work = new WorkExperience();}// 2. 重写clone方法(浅拷贝)@Overridepublic Resume clone() {try {return (Resume) super.clone();} catch (CloneNotSupportedException e) {throw new AssertionError();}}// 设置工作经验public void setWork(String company, int years) {work.setCompany(company);work.setYears(years);}// 显示简历信息public void display() {System.out.printf("姓名:%s 年龄:%d\n", name, age);System.out.printf("工作经历:%s %d年\n", work.getCompany(), work.getYears());}
}class WorkExperience {private String company;private int years;// getter/setter省略
}// 客户端使用
public class Client {public static void main(String[] args) {Resume proto = new Resume("张三", 28);proto.setWork("阿里巴巴", 3);// 克隆对象Resume clone1 = proto.clone();clone1.setWork("腾讯", 2);  // 修改会影响原始对象(浅拷贝问题)proto.display();    // 显示腾讯工作经历(浅拷贝问题)clone1.display();}
}

改进实现(深拷贝)

class DeepResume implements Cloneable {private String name;private int age;private WorkExperience work;public DeepResume(String name, int age) {this.name = name;this.age = age;this.work = new WorkExperience();}// 深拷贝实现@Overridepublic DeepResume clone() {try {DeepResume clone = (DeepResume) super.clone();clone.work = this.work.clone();  // 克隆引用对象return clone;} catch (CloneNotSupportedException e) {throw new AssertionError();}}// WorkExperience也需要实现Cloneablestatic class WorkExperience implements Cloneable {@Overrideprotected WorkExperience clone() throws CloneNotSupportedException {return (WorkExperience) super.clone();}}
}

✅ 优点

  1. 避免重复初始化复杂对象
  2. 动态获取对象运行状态
  3. 可配合对象池提升性能
  4. 比继承更灵活(不依赖具体类)
  5. 符合开闭原则(通过克隆扩展对象)

⚠️ 缺点

  1. 需要正确处理深/浅拷贝问题
  2. 复杂对象的克隆可能比较麻烦
  3. 需要为每个类实现克隆方法
  4. 对final字段的克隆支持有限

🔄 相关模式对比

模式区别
工厂模式关注新对象的创建,原型关注已有对象的复制
备忘录模式都可保存对象状态,但备忘录更关注状态恢复
单例模式原型需要多实例,单例限制实例数量

💡 实践建议

  1. 深拷贝实现方式

    • 递归调用clone方法
    • 序列化/反序列化
    • 使用JSON转换工具
    • 第三方库(如Apache Commons)
  2. 克隆控制

    • 使用原型管理器维护原型集合
    • 实现克隆注册机制
    • 支持原型版本控制
  3. 性能优化

    • 缓存常用原型对象
    • 并行化克隆过程
    • 延迟初始化克隆对象

🚀 典型应用场景

  1. 游戏开发:快速生成大量相似NPC
  2. 文档编辑:模板文档的克隆
  3. 缓存系统:保存热点数据快照
  4. 机器学习:模型参数的复制
  5. 事务管理:保存对象状态用于回滚

📌 实现注意事项

  1. Cloneable接口问题

    • Java的Cloneable是标记接口(无方法)
    • 需要重写Object的clone()方法
    • clone()默认是浅拷贝
  2. 深拷贝实现方案对比

    方式优点缺点
    递归clone原生支持需要修改所有相关类
    序列化自动深拷贝性能较低,需要实现Serializable
    构造器复制完全控制需要维护构造逻辑
  3. 克隆控制技巧

    // 禁止克隆的示例
    public final class Uncloneable {@Overrideprotected final Object clone() throws CloneNotSupportedException {throw new CloneNotSupportedException();}
    }
    

掌握原型模式的关键在于理解对象克隆机制深浅拷贝的区别,合理使用可以显著提升系统性能,特别是在需要大量相似对象生成的场景下优势明显。


http://www.ppmy.cn/devtools/161509.html

相关文章

Java基础进阶提升

(一)Java基础 面向对象java语法常用类,api数据类型方法、对象、引用运算符、操作符关键字、关键词 (二)java进阶 异常、异常分类与处理线程同步、守护线程多线程、IO流接口、多继承jdk、jre、jvm反射、泛型类继承、方法覆盖 (三)数据库 Mysql数据库Oracle数据库…

Cookie 与 localStorage_浏览器存储机制全解析

1. 引言 在现代 Web 开发中,浏览器存储机制是不可或缺的一部分。无论是保存用户偏好、会话信息还是缓存数据,选择合适的存储方式对于提升用户体验和应用性能至关重要。本文将深入探讨两种常见的浏览器存储机制:Cookie 和 localStorage。我们将详细介绍它们的基本概念、应用…

Windows 11【1001问】Windows 11系统硬件配置要求

Windows 11 的设计目标是让用户更贴近自己喜欢的内容,在其发布之际,计算机在连接、创作以及游戏体验方面扮演了更加核心的角色。在设定 Windows 11 的最低系统要求时,我们依据三个关键原则来指导决策,以确保用户能够获得卓越的使用…

前缀和刷题-- LeetCode

文章目录 寻找数组的中心下标题解代码 巧克力题解代码 寻找数组的中心下标 题目 题解 1. 预处理前缀和和后缀和数组,注意边界问题,f(0) 0,g(n-1) 0 2. 然后遍历数组一遍,f[i] g[i],i就是下标 3. 时间复杂度是:O(N) 代码 cl…

从零开始玩转TensorFlow:小明的机器学习故事 5

图像识别的挑战 1 故事引入:小明的“图像识别”大赛 小明从学校里听说了一个有趣的比赛:“美食图像识别”。参赛者需要训练计算机,看一张食物照片(例如披萨、苹果、汉堡等),就能猜出这是什么食物。听起来…

2007年诺基亚内部对iPhone的竞争分析报告

2007年iPhone发布后,诺基亚内部至少有9名员工指出其触屏界面、互联网整合能力将颠覆市场,并建议开发同类产品,但高管因当时占据全球50%市场份额而轻视威胁,认为苹果的高价和虚拟键盘会限制其普及。 诺基亚虽然意识到需推出触屏手机…

基于ffmpeg+openGL ES实现的视频编辑工具-添加背景音乐(十一)

在视频编辑领域,为视频添加背景音乐并实现音频的完美融合是一项关键任务。在上一篇文章中,我们大体介绍了添加背景音乐的整体逻辑,而本文将深入探讨其中音频合并所依赖的滤镜逻辑,通过对相关代码的详细解读,揭示音频合并的核心技术。 一、音频合并滤镜类的初始化 AudioA…

Python Seaborn库使用指南:从入门到精通

1. 引言 Seaborn 是基于 Matplotlib 的高级数据可视化库,专为统计图表设计。它提供了更简洁的 API 和更美观的默认样式,能够轻松生成复杂的统计图表。Seaborn 在数据分析、机器学习和科学计算领域中被广泛使用。 本文将详细介绍 Seaborn 的基本概念、常用功能以及高级用法,…