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

原型模式:克隆对象的艺术

在软件开发中,对象的创建和管理是一个常见且关键的任务。有时候,我们需要创建一个与现有对象完全相同或者相似的新对象,而不是通过构造函数从头开始创建。这时,原型模式(Prototype Pattern)就派上用场了。本文将详细介绍原型模式的概念、实现方式以及在Java中的使用示例。

原型模式是一种创建型设计模式,它允许一个对象在创建另一个可定制的对象,而无需知道如何创建的细节。这种模式通过复制现有对象来创建新对象,从而避免了复杂的对象创建过程。

一,原型模式的优点

  1. 性能提升:通过克隆对象来创建新对象,比直接实例化对象更高效,尤其是当创建对象的过程比较复杂时。
  2. 减少子类数量:通过克隆对象,可以减少需要创建的子类数量,因为可以通过原型对象来创建不同的对象。
  3. 简化对象创建:对于一些复杂对象,通过克隆现有对象可以简化对象的创建过程。

二,原型模式的实现

在Java中,实现原型模式通常需要实现 Cloneable 接口,并覆盖 clone 方法。以下是一个简单的示例:

// 原型类
class Prototype implements Cloneable {private String name;public Prototype(String name) {this.name = name;}public String getName() {return name;}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}// 客户端代码
public class PrototypePatternDemo {public static void main(String[] args) {try {Prototype original = new Prototype("Original");Prototype clone = (Prototype) original.clone();System.out.println("Original: " + original.getName());System.out.println("Clone: " + clone.getName());} catch (CloneNotSupportedException e) {e.printStackTrace();}}
}

在这个示例中,Prototype 类实现了 Cloneable 接口,并覆盖了 clone 方法。客户端代码创建了一个原型对象,并通过调用 clone 方法创建了一个副本。

三,深拷贝与浅拷贝

在原型模式中,有两种类型的拷贝:浅拷贝和深拷贝。

  • 浅拷贝:创建一个新对象,这个新对象是对原始对象的字段的精确拷贝。如果字段是基本数据类型,拷贝的就是基本数据类型的值;如果字段是引用类型,拷贝的就是引用地址。
  • 深拷贝:不仅复制对象的所有字段,还复制所有引用对象所指向的对象。深拷贝比浅拷贝更复杂,因为它需要递归地复制所有引用对象。

以下是一个深拷贝的示例:

import java.io.*;// 原型类
class DeepPrototype implements Serializable {private String name;private InnerObject innerObject;public DeepPrototype(String name, InnerObject innerObject) {this.name = name;this.innerObject = innerObject;}public String getName() {return name;}public InnerObject getInnerObject() {return innerObject;}// 深拷贝方法public DeepPrototype deepClone() {try {ByteArrayOutputStream bos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(bos);oos.writeObject(this);oos.flush();ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());ObjectInputStream ois = new ObjectInputStream(bis);return (DeepPrototype) ois.readObject();} catch (IOException | ClassNotFoundException e) {e.printStackTrace();return null;}}
}// 内部对象类
class InnerObject implements Serializable {private String value;public InnerObject(String value) {this.value = value;}public String getValue() {return value;}
}// 客户端代码
public class DeepPrototypePatternDemo {public static void main(String[] args) {InnerObject innerObject = new InnerObject("Inner Value");DeepPrototype original = new DeepPrototype("Original", innerObject);DeepPrototype clone = original.deepClone();System.out.println("Original: " + original.getName() + ", Inner: " + original.getInnerObject().getValue());System.out.println("Clone: " + clone.getName() + ", Inner: " + clone.getInnerObject().getValue());}
}

在这个示例中,DeepPrototype 类实现了 Serializable 接口,并提供了一个 deepClone 方法,通过序列化和反序列化实现深拷贝。

四,总结

原型模式是一种创建型设计模式,通过复制现有对象来创建新对象。它可以提高性能,减少子类数量,并简化对象创建过程。理解浅拷贝和深拷贝的区别对于正确实现原型模式非常重要。


如果你对设计模式、软件架构、编程技巧等内容感兴趣,欢迎关注我们的同名微信公众号【技术拾光者】。在这里,我们将定期分享最新的技术文章和实用的编程技巧,帮助你不断提升自己的技术水平。

扫描下方二维码,立即关注我们吧!
技术拾光者

感谢你的阅读和支持,我们期待与你在微信公众号上交流更多有趣的技术话题!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 如何训练机器学习力场
  • 绑定变量对于SQL性能的影响
  • 九、外观模式
  • android BLE 蓝牙的连接(二)
  • turbo译码算法MAX, MAX_SCALE and MAX_STAR的比较
  • 算法打卡:第九章 动态规划part13
  • 【python爬虫】之scrapy框架介绍
  • 绕过CDN查找真实IP方法
  • Spring Cloud集成Eurake
  • 重学SpringBoot3-SpringApplicationRunListener
  • 【MPC】无人机模型预测控制复现Data-Driven MPC for Quadrotors项目(Part 1)
  • 【docker npm】npm 私库
  • 关于HarmonyOS的学习
  • SQL注入(数据库)简介
  • 堆叠沙漏网络(stacked hourglass network)学习
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 3.7、@ResponseBody 和 @RestController
  • Docker容器管理
  • JAVA SE 6 GC调优笔记
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • mockjs让前端开发独立于后端
  • MySQL的数据类型
  • Promise初体验
  • Redis 懒删除(lazy free)简史
  • SpiderData 2019年2月23日 DApp数据排行榜
  • 爬虫模拟登陆 SegmentFault
  • 悄悄地说一个bug
  • 双管齐下,VMware的容器新战略
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 原生 js 实现移动端 Touch 滑动反弹
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • # 利刃出鞘_Tomcat 核心原理解析(八)-- Tomcat 集群
  • ###C语言程序设计-----C语言学习(3)#
  • #pragam once 和 #ifndef 预编译头
  • #数据结构 笔记一
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (2)Java 简介
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (day 12)JavaScript学习笔记(数组3)
  • (PySpark)RDD实验实战——取最大数出现的次数
  • (第二周)效能测试
  • (转)scrum常见工具列表
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (转)项目管理杂谈-我所期望的新人
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • .net访问oracle数据库性能问题
  • .net生成的类,跨工程调用显示注释
  • /usr/lib/mysql/plugin权限_给数据库增加密码策略遇到的权限问题
  • @JsonFormat与@DateTimeFormat注解的使用
  • [].slice.call()将类数组转化为真正的数组