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

跟着GPT学设计模式之原型模式

如果对象的创建成本比较大,而同一个类的不同对象之间差别不大(大部分字段都相同),在这种情况下,我们可以利用对已有对象(原型)进行复制(或者叫拷贝)的方式来创建新对象,以达到节省创建时间的目的。这种基于原型来创建对象的方式就叫作原型设计模式(Prototype Design Pattern),简称原型模式。

如果对象中的数据需要经过复杂的计算才能得到(比如排序、计算哈希值),或者需要从 RPC、网络、数据库、文件系统等非常慢速的 IO 中读取,这种情况下,我们就可以利用原型模式,从其他已有对象中直接拷贝得到,而不用每次在创建新对象的时候,都重复执行这些耗时的操作。

建造者模式的实现

说明

原型模式的核心是一个抽象原型类(Prototype),该类定义了克隆方法(clone),用于复制自身并创建新对象。具体的原型类(Concrete Prototype)继承自抽象原型类,并实现了克隆方法。

需要注意的是,在 Java 中使用原型模式进行对象克隆时,通常需要实现 Cloneable 接口,并重写 clone() 方法来实现深层克隆。否则,默认的 clone() 方法只会进行浅层克隆,即复制对象的引用而不是实际数据。如果对象包含引用类型的成员变量,则需要对这些成员变量也进行克隆操作,以保证克隆对象与原始对象之间的数据独立性。

编程示例

// 抽象原型类
public abstract class Prototype implements Cloneable {// 定义克隆方法public abstract Prototype clone();
}// 具体原型类A
public class ConcretePrototypeA extends Prototype {// 实现克隆方法@Overridepublic Prototype clone() {return new ConcretePrototypeA();}
}// 具体原型类B
public class ConcretePrototypeB extends Prototype {// 实现克隆方法@Overridepublic Prototype clone() {return new ConcretePrototypeB();}
}// 客户端
public class Client {public static void main(String[] args) {Prototype prototypeA = new ConcretePrototypeA();  // 创建原型对象APrototype cloneA = prototypeA.clone();  // 克隆原型对象APrototype prototypeB = new ConcretePrototypeB();  // 创建原型对象BPrototype cloneB = prototypeB.clone();  // 克隆原型对象B}
}

抽象原型类 Prototype 定义了克隆方法 clone(),具体原型类 ConcretePrototypeA 和 ConcretePrototypeB 分别继承自抽象原型类,并实现了克隆方法。客户端通过实例化具体原型类来创建原型对象,然后通过调用克隆方法 clone() 复制该对象并创建新的对象。

深度拷贝的另外一种实现方法:

public Object deepCopy(Object object) {ByteArrayOutputStream bo = new ByteArrayOutputStream();ObjectOutputStream oo = new ObjectOutputStream(bo);oo.writeObject(object);ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());ObjectInputStream oi = new ObjectInputStream(bi);return oi.readObject();
}

以上内容基于GPT创建和整理。

参考

  • 设计模式之美-王争
http://www.lryc.cn/news/295271.html

相关文章:

  • 博客|基于Springboot的个人博客系统设计与实现(源码+数据库+文档)
  • 【gcc】webrtc发送侧计算 丢包率
  • elementui上传文件不允许重名
  • 鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Video媒体组件
  • Linux操作系统运维-Docker的基础知识梳理总结
  • PMP考试成绩如何查询?
  • 【Scala】 2. 函数
  • 14.0 Zookeeper环球锁实现原理
  • 课时16:本地变量_普通变量
  • 阿里云服务器centos_7_9_x64位,3台,搭建k8s集群
  • 代码随想录第二十八天
  • 【python】绘制爱心图案
  • 在 Elastic Agent 中为 Logstash 输出配置 SSL/TLS
  • Vue中对虚拟DOM的理解
  • golang通用后台管理项目——Go+Vue通用后台管理项目实战
  • 推动海外云手机发展的几个因素
  • python coding with ChatGPT 打卡第17天| 二叉树:找树左下角的值、路径总和
  • 2020年通信工程师初级 综合能力 真题
  • 12.0 Zookeeper 数据同步流程
  • 作业2.6
  • Qt应用软件【协议篇】TCP示例
  • C# CAD交互界面-自定义面板集(四)
  • 物流自动化移动机器人|HEGERLS三维智能四向穿梭车助力优化企业供应链
  • EasyExcel下载带下拉框和批注模板
  • C语言之字符逆序(牛客网)
  • RAPTOR:树组织检索的递归抽象处理
  • 图论:合适的环
  • 【数据分享】1929-2023年全球站点的逐月平均降水量(Shp\Excel\免费获取)
  • React+Antd实现省、市区级联下拉多选组件(支持只选省不选市)
  • CentOS镜像如何下载?在VMware中如何安装?