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

Java创建型模式---原型模式

原型模式基础概念

原型模式是一种创建型设计模式,其核心思想是通过复制(克隆)现有对象来创建新对象,而无需依赖显式的类实例化过程。这种模式适用于创建对象成本较高(如初始化时间长、资源消耗大)或需要避免复杂的对象创建逻辑的场景。

原型模式的核心组件

  1. 原型接口 (Prototype) - 定义克隆方法的接口
  2. 具体原型类 (ConcretePrototype) - 实现原型接口,提供克隆方法的具体实现
  3. 客户端 (Client) - 通过调用原型对象的克隆方法来创建新对象

浅克隆与深克隆

在 Java 中,克隆分为两种类型:

浅克隆 (Shallow Clone) - 复制对象时,仅复制对象本身及其基本数据类型字段,而引用类型字段仍指向原对象的引用

  1. 深克隆 (Deep Clone) - 复制对象时,不仅复制对象本身,还递归复制其引用类型字段,确保新对象和原对象完全独立

原型模式的实现

下面通过示例代码展示原型模式的实现:

import java.util.ArrayList;
import java.util.List;// 原型接口
interface Prototype {Prototype clone();
}// 具体原型类 - 浅克隆示例
class Employee implements Prototype, Cloneable {private String name;private int age;private List<String> skills; // 引用类型字段public Employee(String name, int age, List<String> skills) {this.name = name;this.age = age;this.skills = skills;}// Getters and setterspublic String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public List<String> getSkills() {return skills;}public void setSkills(List<String> skills) {this.skills = skills;}// 浅克隆实现@Overridepublic Employee clone() {try {// 调用Object类的clone()方法进行浅克隆Employee cloned = (Employee) super.clone();return cloned;} catch (CloneNotSupportedException e) {e.printStackTrace();return null;}}@Overridepublic String toString() {return "Employee{" +"name='" + name + '\'' +", age=" + age +", skills=" + skills +'}';}
}// 具体原型类 - 深克隆示例
class Department implements Prototype, Cloneable {private String deptName;private Employee manager; // 引用类型字段public Department(String deptName, Employee manager) {this.deptName = deptName;this.manager = manager;}// Getters and setterspublic String getDeptName() {return deptName;}public void setDeptName(String deptName) {this.deptName = deptName;}public Employee getManager() {return manager;}public void setManager(Employee manager) {this.manager = manager;}// 深克隆实现@Overridepublic Department clone() {try {// 调用Object类的clone()方法进行浅克隆Department cloned = (Department) super.clone();// 手动深克隆引用类型字段if (this.manager != null) {// 递归克隆manager对象Employee clonedManager = this.manager.clone();// 为避免无限递归,需要在Employee类中实现深克隆// 这里假设Employee类已经正确实现了深克隆cloned.manager = clonedManager;}return cloned;} catch (CloneNotSupportedException e) {e.printStackTrace();return null;}}@Overridepublic String toString() {return "Department{" +"deptName='" + deptName + '\'' +", manager=" + manager +'}';}
}// 原型管理器 - 集中管理原型对象
class PrototypeManager {private static final java.util.Map<String, Prototype> prototypes = new java.util.HashMap<>();static {// 初始化一些原型对象List<String> skills = new ArrayList<>();skills.add("Java");skills.add("Spring");Employee employeePrototype = new Employee("Prototype Employee", 30, skills);prototypes.put("employee", employeePrototype);Department deptPrototype = new Department("IT Department", employeePrototype);prototypes.put("department", deptPrototype);}// 获取原型对象的克隆public static Prototype getClone(String key) {Prototype prototype = prototypes.get(key);if (prototype != null) {return prototype.clone();}return null;}// 注册新的原型对象public static void registerPrototype(String key, Prototype prototype) {prototypes.put(key, prototype);}
}// 客户端代码
public class PrototypePatternClient {public static void main(String[] args) {// 使用原型管理器获取克隆对象Employee clonedEmployee = (Employee) PrototypeManager.getClone("employee");Department clonedDepartment = (Department) PrototypeManager.getClone("department");System.out.println("Original Employee: " + PrototypeManager.getClone("employee"));System.out.println("Cloned Employee: " + clonedEmployee);System.out.println("\nOriginal Department: " + PrototypeManager.getClone("department"));System.out.println("Cloned Department: " + clonedDepartment);// 验证浅克隆和深克隆的效果// 修改克隆对象的基本类型字段clonedEmployee.setAge(35);// 修改克隆对象的引用类型字段List<String> clonedSkills = clonedEmployee.getSkills();clonedSkills.add("Hibernate");System.out.println("\nAfter modification:");System.out.println("Original Employee: " + PrototypeManager.getClone("employee"));System.out.println("Cloned Employee: " + clonedEmployee);// 验证深克隆Employee clonedManager = clonedDepartment.getManager();clonedManager.setName("New Manager");System.out.println("\nAfter manager modification:");System.out.println("Original Department Manager: " + ((Department) PrototypeManager.getClone("department")).getManager().getName());System.out.println("Cloned Department Manager: " + clonedDepartment.getManager().getName());}
}

原型模式的应用场景

  1. 对象创建成本高 - 当对象创建过程复杂或耗时较长时
  2. 避免重复初始化 - 当需要创建多个相同或相似的对象时
  3. 动态配置对象 - 当系统需要从现有对象动态生成新对象时
  4. 缓存原型对象 - 当需要缓存对象状态并在需要时恢复时

原型模式的优缺点

优点

  • 提高性能 - 避免重复创建对象的开销
  • 简化对象创建 - 无需了解对象创建的具体细节
  • 扩展性好 - 可以在运行时动态添加或删除原型
  • 简化复杂对象创建 - 适合创建复杂配置的对象

缺点

  • 实现复杂 - 深克隆的实现可能比较复杂
  • 克隆方法维护困难 - 当类的结构发生变化时,需要修改克隆方法
  • 对克隆方法的依赖 - 必须实现 Cloneable 接口并重写 clone () 方法

使用原型模式的注意事项

  1. 正确实现克隆方法 - 确保浅克隆和深克隆的正确实现
  2. 处理引用类型字段 - 在深克隆中,需要递归克隆所有引用类型字段
  3. 考虑线程安全 - 如果在多线程环境中使用,需要考虑克隆方法的线程安全性
  4. 原型管理器的使用 - 对于复杂系统,考虑使用原型管理器集中管理原型对象
  5. 替代方案 - 在某些情况下,可以考虑使用序列化和反序列化实现深克隆

原型模式是一种非常实用的设计模式,它通过复制现有对象来创建新对象,避免了复杂的对象创建过程,提高了性能和灵活性。在实际开发中,根据对象的复杂度和需求,可以选择浅克隆或深克隆来实现原型模式。

http://www.xdnf.cn/news/1085671.html

相关文章:

  • 【C语言】指针与回调机制学习笔记
  • 【Java安全】反射基础
  • RoboRefer:面向机器人视觉-语言模型推理的空间参考
  • Web后端开发-分层解耦
  • Playfun即将开启大型Web3线上活动,打造沉浸式GameFi体验生态
  • 【ElasticSearch实用篇-01】需求分析和数据制造
  • turborepo 如何解决git管理包过大的问题
  • 病虫害数据集
  • 「Windows/Mac OS」AIGC图片生成视频 ,webui + stable-diffusion环境部署教程
  • AI编程才刚起步,对成熟的软件工程师并未带来质变
  • 【学习笔记】大数定理,频率与概率,均值与期望的区别
  • 深入解析TCP:可靠传输的核心机制与实现逻辑(三次握手、四次挥手、流量控制、滑动窗口、拥塞控制、慢启动、延时应答、面向字节流、粘包问题)
  • Java 命令行参数详解:系统属性、JVM 选项与应用配置
  • PCA通过“找最大方差方向”实现降维,本质是用更少的变量捕捉原始数据的主要模式
  • 3S技术+ArcGIS/ENVI全流程实战:水文、气象、灾害、生态、环境及卫生等领域应用
  • 深度学习7(梯度下降算法改进)
  • 使用Ideal创建一个spring boot的helloWorld项目
  • TMC4361A 使用(未验证)
  • 如何排查服务器中已经存在的后门程序?
  • 【应急响应】Linux 自用应急响应工具(LinuxCheckShoot)
  • 接口漏洞怎么抓?Fiddler 中文版 + Postman + Wireshark 实战指南
  • 提示工程(Prompt Engineering)研究进展
  • Camera相机人脸识别系列专题分析之十六:人脸特征检测FFD算法之libcvface_api.so数据结构详细注释解析
  • AWS VPC Peering
  • Linux中程序的limits中的Max open files的配置由哪些参数决定
  • 明星AI自动化测试工具Midscene.js源码解析
  • Pr插件图文安装教程
  • 实用机器学习
  • C盘瘦身 -- 虚拟内存文件 pagefile.sys
  • 华为OD机试 2025B卷 - 字符串加密 (C++ Python JAVA JS C语言)