Java编程之原型模式

原型模式的定义

原型模式(Prototype Pattern)是一种创建型设计模式,通过复制已有对象来创建新对象,而非通过常规的手段的new关键字来实例化。适用于对象创建成本较高或需要动态配置的场景。
例如,在一个游戏开发中,可能需要创建大量具有相似属性的游戏角色。如果每个角色都通过构造函数来创建,并且初始化过程涉及到加载大量资源(如纹理、模型等),那么创建这些角色将消耗大量的时间和资源。使用原型模式,我们可以先创建一个原型角色对象,然后通过克隆这个原型来快速生成多个相似的角色对象,大大提高了创建效率。​
在 Java 中,原型模式的实现主要依赖于Cloneable接口和Object类中的clone()方法。当一个类实现了Cloneable接口,就表明该类的对象可以被克隆。Object类中的clone()方法是一个本地方法,它负责创建并返回当前对象的一个副本。但需要注意的是,默认的clone()方法执行的是浅克隆(Shallow Copy),这在某些情况下可能无法满足我们的需求。

原型模式的核心角色

  1. Prototype(抽象原型):声明克隆方法的接口,通常包含一个clone()方法,用于创建并返回对象的副本(通常为Cloneable接口)。
  2. ConcretePrototype(具体原型):实现克隆方法的具体类。 实现了抽象原型类中声明的克隆方法,在克隆方法中返回自己的一个克隆对象。
  3. 客户类(Client):使用原型对象来创建新对象的类。客户类通过调用原型对象的clone()方法来获取新的对象实例,而无需关心对象的具体创建过程。

实现方式

Java中通过Cloneable接口和Object.clone()实现原型模式。
下面通过一个简单的 Java 代码示例来展示原型模式的结构:​

// 抽象原型类
interface Prototype {Prototype clone();
}// 具体原型类
class ConcretePrototype implements Prototype {private String data;public ConcretePrototype(String data) {this.data = data;}public String getData() {return data;}@Overridepublic Prototype clone() {// 这里简单返回一个新的实例,实际应用中可能需要更复杂的克隆逻辑return new ConcretePrototype(data);}
}// 客户类
public class Client {public static void main(String[] args) {ConcretePrototype prototype = new ConcretePrototype("初始数据");Prototype clonedPrototype = prototype.clone();System.out.println("原对象数据: " + prototype.getData());System.out.println("克隆对象数据: " + clonedPrototype.getData());}
}

需注意浅拷贝与深拷贝的区别。

浅拷贝示例

仅复制对象本身,不复制引用字段指向的对象。

class ShallowPrototype implements Cloneable {private String name;private List<String> list;public ShallowPrototype(String name, List<String> list) {this.name = name;this.list = list;}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone(); // 浅拷贝}
}
深拷贝示例

复制对象及其引用字段指向的所有对象。

class DeepPrototype implements Cloneable {private String name;private List<String> list;public DeepPrototype(String name, List<String> list) {this.name = name;this.list = list;}@Overrideprotected Object clone() throws CloneNotSupportedException {DeepPrototype copy = (DeepPrototype) super.clone();copy.list = new ArrayList<>(this.list); // 深拷贝引用字段return copy;}
}

原型模式的优缺点

优点

  • 避免重复初始化对象,提升性能。
  • 动态配置新对象,无需依赖子类构造。

缺点

  • 深拷贝实现复杂,需递归处理引用对象。
  • 破坏封装性,需谨慎处理clone()方法。

应用场景

  1. 对象创建耗时(如数据库查询结果缓存)。
  2. 需要动态配置对象属性(如游戏中人物的克隆)。
  3. 结合工厂模式使用,统一对象创建逻辑。

注意事项

  • 确保clone()方法正确处理可变引用字段。
  • 若类包含非Cloneable的引用对象,需自定义深拷贝逻辑。
  • 考虑使用序列化/反序列化实现深拷贝(如Apache CommonsSerializationUtils)。

通过合理使用原型模式,可以显著优化对象创建效率,尤其适合复杂对象的复制场景。

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

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

相关文章

RAG质量评估

当完成了一个RAG系统的开发工作以后&#xff0c;还需要对该系统的性能进行评估。如何对RAG系统的性能进行评估呢&#xff1f;仔细分析RAG系统的产出成果&#xff0c;主要涉及以下几点&#xff1a; &#xff08;1&#xff09;检索器组件 检索的相关文档 context, &#xff08;…

LLMs基础学习(八)强化学习专题(1)

LLMs基础学习&#xff08;八&#xff09;强化学习专题&#xff08;1&#xff09; 文章目录 LLMs基础学习&#xff08;八&#xff09;强化学习专题&#xff08;1&#xff09;学习资料资源强化学习是什么强化学习一句话精准定义 强化学习与其他学习类型的对比强化学习 vs 监督学习…

19-Oracle 23 ai Database Sharding-知识准备

小伙伴是不是经常遇见大规模集群和数量的时候&#xff0c;业务就提出要对数据进行sharding。 Oracle 和其他数据库&#xff08;如 MySQL、PostgreSQL、MongoDB 等&#xff09; 为什么要进行分片&#xff08;sharding&#xff09;&#xff0c;分片的原因是什么&#xff0c;实现…

分类与逻辑回归 - 一个完整的guide

线性回归和逻辑回归其实比你想象的更相似 &#x1f603; 它们都是所谓的参数模型。让我们先看看什么是参数模型&#xff0c;以及它们与非参数模型的区别。 线性回归 vs 逻辑回归 线性回归&#xff1a;用于回归问题的线性参数模型。逻辑回归&#xff1a;用于分类问题的线性参数…

英语写作中“每一个”each individual、every individual、every single的用法

一、Individual &#xff1a;个体&#xff0c;相对于团体&#xff0c;例如&#xff1a; Individual competition &#xff08;个人比赛&#xff09;&#xff0c;相对于team competition &#xff08;团体比赛&#xff09; Individual users &#xff08;个人用户&#xff09;…

由于 z(x,y) 的变化导致的影响(那部分被分给了链式项)

✅ 本质问题&#xff1a;为什么链式法则中 ∂ F ∂ x \frac{\partial F}{\partial x} ∂x∂F​ 不考虑 z z ( x , y ) zz(x,y) zz(x,y)&#xff1f; &#x1f50d; 一、关键是&#xff1a;偏导数的定义是什么&#xff1f; 我们从最根本的定义开始&#xff1a; ∂ F ( x , y…

python打卡day44@浙大疏锦行

知识点回顾&#xff1a; 预训练的概念常见的分类预训练模型图像预训练模型的发展史预训练的策略预训练代码实战&#xff1a;resnet18 作业&#xff1a; 尝试在cifar10对比如下其他的预训练模型&#xff0c;观察差异&#xff0c;尽可能和他人选择的不同尝试通过ctrl进入resnet的…

十一(3) 类,加深对拷贝构造函数的理解

class ClassName { public: // 拷贝构造函数&#xff1a;参数是同类型对象的引用&#xff08;通常为 const 引用&#xff09; ClassName(const ClassName& other) { // 复制 other 的成员变量到当前对象 } }; 参数要求&#xff1a;必须是同类型对象的引用&#xff0…

网页后端开发(基础1--maven)

maven的作用&#xff1a; Maven是一款管理和构建Java项目的工具。 1.依赖管理&#xff1a; 方便快捷的管理项目依赖的资源&#xff08;jar包&#xff09; 不用手动下载jar包&#xff0c;只需要中maven中引用&#xff0c;maven会查找本地仓库。若本地仓库没有&#xff0c;会直…

认识电子元器件---高低边驱动

目录 一、基本概念 二、关键参数对比 三、工作原理 &#xff08;1&#xff09;高边驱动 &#xff08;2&#xff09;低边驱动 四、典型的应用场景 五、如何选择 一、基本概念 可以理解成&#xff1a;高低边驱动是MOS/IGBT的一种应用方式 高低边驱动是电路拓扑概念&#…

JavaScript 标签加载

目录 JavaScript 标签加载script 标签的 async 和 defer 属性&#xff0c;分别代表什么&#xff0c;有什么区别1. 普通 script 标签2. async 属性3. defer 属性4. type"module"5. 各种加载方式的对比6. 使用建议 JavaScript 标签加载 script 标签的 async 和 defer …

C/CPP 结构体、联合体、位段内存计算 指南

C/CPP 结构体、联合体、位段内存计算 指南 在C语言中&#xff0c;结构体、联合体和位段是对数据的高级抽象&#xff0c;它们可以让程序员以更易于理解的方式来操作复杂的数据结构。然而&#xff0c;这些结构在内存中的布局可能并不如它们的语法结构那样直观&#xff0c;特别是当…

ASR(语音识别)语音/字幕标注 通过via(via_subtitle_annotator)

文章目录 1 VIA 官网资料2 语音/字幕标注3 键盘快捷键常规当一个时间片段被选中时图像或视频帧中的空间区域 1 VIA 官网资料 VIA官网&#xff1a;https://www.robots.ox.ac.uk/~vgg/software/via/ VIA官网标注示例&#xff1a;https://www.robots.ox.ac.uk/~vgg/software/via/…

mq安装新版-3.13.7的安装

一、下载包&#xff0c;上传到服务器 https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.13.7/rabbitmq-server-generic-unix-3.13.7.tar.xz 二、 erlang直接安装 rpm -ivh erlang-26.2.4-1.el8.x86_64.rpm不需要配置环境变量&#xff0c;直接就安装了。 erl…

高通平台PCIE EP模式log丢失问题

高通平台PCIE EP模式log丢失问题 1 问题背景2 问题分析2.1 对比USB2.1.1 Logtool优化2.1.2 Device mhi与fs对比2.2 优化方案2.2.1 Diag系统优化2.2.2 Host mhi优化3 最终成果1 问题背景 高通5G模组如SDX55\SDX62\SDX65\SDX72\SDX75等支持pcie ep模式。会通过pcie与host(如MT7…

Python应用输入输出函数

大家好!在 Python 编程中&#xff0c;输入输出函数是与用户进行交互的桥梁。通过输入函数&#xff0c;我们可以获取用户的输入数据&#xff1b;通过输出函数&#xff0c;我们可以向用户展示程序的运行结果。对于初学者来说&#xff0c;掌握基本的输入输出操作是编程入门的重要一…

如何使用 Ansible 在 Ubuntu 24.04 上安装和设置 LNMP

在当今世界,自动化是有效管理和部署 Web 应用程序的关键。Ansible 是一个强大的自动化工具,它是一款开源软件配置、配置管理和应用程序部署工具。本文将指导您使用 Ansible 在 Ubuntu 服务器上安装 LNMP 堆栈(Linux、Nginx、MySQL、PHP)。 先决条件 为了执行本指南中讨论的…

Xela矩阵三轴触觉传感器的工作原理解析与应用场景

Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知&#xff0c;帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量&#xff0c;能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度&#xff0c;还为机器人、医疗设备和制造业的智…

RK3288项目(四)--linux内核之V4L2框架及ov9281驱动分析(中)

目录 一、引言 二、V4L2其他部件驱动分析 ------>2.1、mipi-dphy ------------>2.1.1、dts ------------>2.1.2、driver ------------>2.1.3、notifier机制 ------------>2.1.4、异步回调 ------------>2.1.5、V4L2 subdev ------>2.2、mipi-csi…

容器-使用slim减少10x+大模型镜像

slim&#xff08;原docker-slim&#xff09;是一个开源工具&#xff0c;全称SlimToolkit&#xff08;https://github.com/slimtoolkit/slim&#xff09;&#xff0c;用于基于已有的Docker镜像减小镜像的大小&#xff0c;同时尽可能保留容器的功能。它通过分析镜像的运行环境和应…