java23种设计模式-原型模式

news/2025/2/25 17:23:38

原型模式(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方法(浅拷贝)
    @Override
    public 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();
    }

    // 深拷贝实现
    @Override
    public DeepResume clone() {
        try {
            DeepResume clone = (DeepResume) super.clone();
            clone.work = this.work.clone();  // 克隆引用对象
            return clone;
        } catch (CloneNotSupportedException e) {
            throw new AssertionError();
        }
    }

    // WorkExperience也需要实现Cloneable
    static class WorkExperience implements Cloneable {
        @Override
        protected 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 {
        @Override
        protected final Object clone() throws CloneNotSupportedException {
            throw new CloneNotSupportedException();
        }
    }
    

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


http://www.niftyadmin.cn/n/5865761.html

相关文章

基于深度学习的SSD口罩识别项目完整资料版(视频教程+课件+源码+数据)

基于深度学习的SSD口罩识别项目完整资料版,包含视频教程、PPT课件和源码. 01 项目介绍.mp4 02 SSD算法原理回顾.mp4 03 数据集收集.mp4 04 自定义数据集.mp4 05 生成anchors.mp4 06 展示anchors.mp4 07 计算iou值.mp4 08 计算target.mp4 09 定义模型.mp4 10 模型训练…

【开关电源】汽车前端电源保护电路设计

前言: 汽车电池端子在启动或者保养过程中被反接,如果对这些故障不能及时处理,就可能导致ECU或供电设备被损坏;此外在供电过程中电压也存在不稳定的情况。在EMC测试中ISO16750和ISO7637也会有负电压的情况。 肖特基二极管和 P 沟道…

抖音营销创新策略与案例分析:以奈雪的茶为例及开源AI智能名片2+1链动模式S2B2C商城小程序的启示

摘要:随着互联网技术的快速发展,社交媒体平台已成为品牌推广和市场营销的重要阵地。抖音作为短视频领域的佼佼者,凭借其庞大的用户基础和强大的算法推荐机制,为众多品牌提供了广阔的营销空间。本文以奈雪的茶在抖音的6周年营销活动…

计算机视觉算法

计算机视觉算法简介 计算机视觉(Computer Vision)作为人工智能的一个重要分支,致力于让计算机能够“看”并理解图像或视频中的内容。其应用领域广泛,从自动驾驶汽车、医疗影像分析到增强现实和安全监控等。随着深度学习技术的发展,计算机视觉已经取得了显著的进展,尤其是…

ARM-Linux 基础项目篇——简单的视频监控

该基础项目为后面的 AI 安防项目做铺垫。使用 Qt 的网络编程方案来实现,后期再实现流媒体协议的方案。使用 ov2640 摄像头。 一、实现流程 (1) 服务器采集摄像头的数据。 (2) 处理视频数据转交给 Socket,…

CSS滚动条原理与自定义样式指南,CSS滚动条样式失效,滚动条样式无效,-webkit-scrollbar无效,overflow不显示滚动条

滚动内容形成的必要条件 CSS Overflow属性解析 MDN官方文档-Overflow属性 菜鸟教程-Overflow属性 overflow 属性控制内容溢出元素框时在对应的元素区间内是否添加滚动条。 值描述visible默认值。内容不会被修剪,会呈现在元素框之外。hidden内容会被修剪&#xf…

FastExcel 实现数据分批次导入、导出

是基于 FastExcel 实现数据分批次导入和保存的完整解决方案&#xff0c;结合了高性能流式读取与分批处理机制&#xff1a; 一、环境准备 依赖配置 <dependency><groupId>cn.idev.excel</groupId><artifactId>fastexcel</artifactId><version&…

Java Set实现类面试题

Java Set实现类面试题 HashSet Q1: HashSet的实现原理是什么&#xff1f; HashSet是基于HashMap实现的&#xff0c;使用HashMap的key来存储元素&#xff0c;value统一使用一个Object对象。 public class HashSetPrincipleExample {// 模拟HashSet的基本实现public class Si…