设计模式(五)原型模式详解

设计模式(五)原型模式详解

原型模型简介

  1. 定义:原型模型是一种创建型设计模型,它允许通过克隆/复制现有对象来创建新的对象,而无需通过常规的构造函数进行实例化。

  2. 这种方式的主要优势是在运行时不需要知道具体的类,只需一个实例对象即可。

  3. 实现方法

    • 实现Cloneable接口:在Java中,如果一个类想要支持克隆操作,通常需要实现Cloneable接口,并重写Object类中的clone()方法。

    • 深拷贝与浅拷贝

      浅拷贝:只复制对象本身,对于对象内部引用的其他对象,仍然共享同一个引用。

      深拷贝:不仅复制对象本身,还递归地复制对象内部引用的所有对象,确保新对象与原对象完全独立。

原型模式的关键组件
  • Prototype(抽象原型类):声明了一个克隆自身的接口,由于Java中已经提供了Cloneable接口,我们不需要再创建原型接口。

  • ConcretePrototype(具体原型类):创建一个Video类,实现Cloneable接口。

  • Client(客户端):使用原型类提供的克隆方法来获取新对象。

浅克隆
package com.briup.patterns_design.prototype.demo01;import java.util.Date;/*** 原型模式 -- 浅拷贝* @author 35329** 如何实现克隆/ 拷贝* 1、实现一个接口* 2、重写一个方法*/
// Video原型类
public class Video implements Cloneable{ // 无良up主,克隆别人的视频private String name;private Date createTime;@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}public Video() {}public Video(String name, Date createTime) {this.name = name;this.createTime = createTime;}@Overridepublic String toString() {return "Video{" +"name='" + name + '\'' +", createTime=" + createTime +'}';}public String getName() {return name;}public void setName(String name) {this.name = name;}public Date getCreateTime() {return createTime;}public void setCreateTime(Date createTime) {this.createTime = createTime;}
}
package com.briup.patterns_design.prototype.demo01;import java.util.Date;/*** @author 35329*/
public class BiliBiliClient {public static void main(String[] args) throws CloneNotSupportedException {// 原型对象 v1Date date = new Date();Video v1 = new Video("原型模式学习", date);System.out.println("v1 = " + v1);System.out.println("v1.hashCode() = " + v1.hashCode());// v1 克隆 v2// Video v2 = new Video("原型模式学习", date); 原始写法Video v2 = (Video) v1.clone(); // 克隆出来的对象和原来的一模一样System.out.println("v2 = " + v2);System.out.println("v2.hashCode() = " + v2.hashCode());v2.setName("Clone:原型模式学习");System.out.println(v2);}
}

深克隆
package com.briup.patterns_design.prototype.demo02;import java.util.Date;/*** 原型模式 -- 深拷贝* @author 35329** 如何实现克隆/ 拷贝* 1、实现一个接口* 2、重写一个方法*/
// Video原型类
public class Video implements Cloneable{ // 无良up主,克隆别人的视频private String name;private Date createTime;@Overrideprotected Object clone() throws CloneNotSupportedException {Object obj = super.clone();// 实现深克隆 ~ 序列化、反序列化Video v = (Video) obj;// 将这个对象的属性页进行克隆v.createTime = (Date) this.createTime.clone();return obj;}public Video() {}public Video(String name, Date createTime) {this.name = name;this.createTime = createTime;}@Overridepublic String toString() {return "Video{" +"name='" + name + '\'' +", createTime=" + createTime +'}';}public String getName() {return name;}public void setName(String name) {this.name = name;}public Date getCreateTime() {return createTime;}public void setCreateTime(Date createTime) {this.createTime = createTime;}
}
package com.briup.patterns_design.prototype.demo02;import java.util.Date;/*** @author 35329** 应用场景:* Spring Bean:单例模式,原型模式* 原型模式 + 工厂模式 ==> new <=替换为=>原型模式**/
public class BiliBiliClient {public static void main(String[] args) throws CloneNotSupportedException {// 原型对象 v1Date date = new Date();Video v1 = new Video("原型模式学习", date);Video v2 = (Video) v1.clone(); // 克隆出来的对象和原来的一模一样System.out.println("v1 = " + v1);System.out.println("v2 = " + v2);System.out.println("=================================");date.setTime(5654251);System.out.println("v1 = " + v1);System.out.println("v2 = " + v2);}
}

小结

本文详细介绍了原型模式的概念、应用场景以及如何在Java中实现原型模式。原型模式通过复制现有的对象来创建新的对象,有助于在运行时动态地创建和修改对象。通过实现Cloneable接口并重写clone()方法,可以方便地实现对象的克隆。

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

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

相关文章

【C++单调栈】962. 最大宽度坡|1607

本文涉及的基础知识点 C单调栈 LeetCode962. 最大宽度坡 给定一个整数数组 A&#xff0c;坡是元组 (i, j)&#xff0c;其中 i < j 且 A[i] < A[j]。这样的坡的宽度为 j - i。 找出 A 中的坡的最大宽度&#xff0c;如果不存在&#xff0c;返回 0 。 示例 1&#xff1a;…

免费的GB28181设备端EasyGBD,支持国标GB28181-2016和国标GB28181-2022,支持各种ARM系统、国产芯片、信创芯片

现在市面上还有很多卖国标GB28181设备端SDK的&#xff0c;EasyGBD免费的&#xff0c;基于C/C开发的国标GB28181设备库。 技术规格 编程语言&#xff1a;C/C&#xff0c;能适配任何平台&#xff0c;包括但不限于Windows、Linux、Android、ARM视频编解码器&#xff1a;H264、H26…

MPL助力固态前驱体光刻胶,图案化金属氧化物半导体更精密

大家好&#xff01;今天来了解一项金属氧化物增材制造研究——《Ultra-high precision nano additive manufacturing of metal oxide semiconductors via multi-photon lithography》发表于《nature communications》。在现代电子信息领域&#xff0c;金属氧化物半导体至关重要…

【031】基于SpringBoot+Vue实现的在线考试系统

文章目录 系统说明技术选型成果展示账号地址及其他说明源码获取 系统说明 基于SpringBootVue实现的在线考试系统是为高校打造的一款在线考试平台。 系统功能说明 1、系统共有管理员、老师、学生三个角色&#xff0c;管理员拥有系统最高权限。 2、老师拥有考试管理、题库管理…

mpu6050 设置低功耗模式

mpu6050 电源管理寄存器&#xff0c;参考博客&#xff1a;MPU6050学习笔记&#xff08;电源管理器1、2&#xff09; - LivingTowardTheSun - 博客园 (cnblogs.com) 根据手册&#xff0c;设置对应的寄存器即可&#xff1b; 具体代码&#xff1a; #define MPU_PWR_MGMT1_REG …

111.SAP ABAP - Function ALV - 列、行、单元格颜色 - 记录

目录 1.介绍 2.列背景色 3.行背景色 4.单元格背景色 4.1颜色码相关的结构 LVC_T_SCOL LVC_S_SCOL LVC_S_COLO 4.2单元格颜色设置方法 5.ALV 颜色码 1.介绍 在数据展示方面&#xff0c;要求ALV的数据列、行、单元格通过颜色醒目显示&#xff08;颜色展示…

【01】ZooKeeper特性与节点数据类型

1、Zookeeper介绍 ZooKeeper是一个开源的分布式协调框架&#xff0c;是Apache Hadoop 的一个子项目&#xff0c;主要用来解决分布式集群中应用系统的一致性问题。Zookeeper 的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来&#xff0c;构成一个高效可靠的原语集&…

掌控板micropython编程实现OLED中显示汉字

掌控板micropython编程实现OLED中显示汉字 1. 介绍 在ESP32中显示中文有很多种办法&#xff0c;例如&#xff0c;使用支持汉字的固件&#xff08;https://blog.csdn.net/weixin_42227421/article/details/134632037&#xff09;&#xff1b;使用PCtoLCD2002软件生成自定义字体…

apache poi导出excel

简介 常见的使用场景 入门 导入maven依赖 <!-- poi --> <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId> </dependency> <dependency><groupId>org.apache.poi</groupId><arti…

机器视觉:9点标定的原理与实现

一、什么是标定 标定就是将机器视觉处理得到的像素坐标转换成实际项目中使用到的毫米坐标。简单说即使看看实际单位距离内有几个像素&#xff0c;如下图所示&#xff0c;10mm的距离内有222个像素&#xff0c;那像素坐标和实际的毫米坐标就有个比例关系了。 二、九点标定 9点标…

【万能软件篇】03-Batchplot_setup_3.5.6(CAD批量打印插件)

批量打印插件&#xff08;Batchplot&#xff09;简介 Batchplot是一个专门针对AutoCAD2000以上版本设计的单DWG多图纸的批量生成布局、批量打印、批量分图工具。自行判定的图框位置与尺寸&#xff0c;根据当前的打印机设置&#xff0c;自动调整打印的方式&#xff0c;实现批量生…

2024 AFS-46 电子数据存在性鉴定(移动终端)(2024能力验证)

一、委托事项 1.给出检材手机的MEID。 2.给出检材手机在2024年7月3日上午连接过的设备名称。 3.给出检材手机中kimi应用最近一次被中断回答的问题内容。 4.给出检材手机中安装过的即时通讯应用的包名&#xff08;不包含虚拟机中的应用&#xff09;。 5.检材手机中安装有几…

C#与C++交互开发系列(十一):委托和函数指针传递

前言 在C#与C的互操作中&#xff0c;委托&#xff08;delegate&#xff09;和函数指针的传递是一个复杂但非常强大的功能。这可以实现从C回调C#方法&#xff0c;或者在C#中调用C函数指针的能力。无论是跨语言调用回调函数&#xff0c;还是在多线程、异步任务中使用委托&#x…

《数字图像处理基础》学习03-图像的采样

在之前的学习中我已经知道了图像的分类&#xff1a;物理图像和虚拟图像。《数字图像处理基础》学习01-数字图像处理的相关基础知识_图像处理 数字-CSDN博客 目录 一&#xff0c;连续图像和离散图像的概念 二&#xff0c;图像的采样 1&#xff0c; 不同采样频率采样同一张图…

Linux系统基础-多线程超详细讲解(1)

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 Linux系统基础-多线程超详细讲解(1) 收录于专栏[Linux学习] 本专栏旨在分享学习Linux的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 …

QGIS提取面的顶点坐标到属性表

相关参考&#xff1a;QGIS中提取面的中心坐标到属性表-CSDN博客 polygon_layer QgsProject.instance().mapLayersByName("Polygon")[0]polygon_layer.startEditing() polygon_layer.dataProvider().addAttributes([QgsField("coors", QVariant.String, le…

面向对象编程中类与类之间的关系(二)

目录 1.引言 2.泛化&#xff08;继承&#xff09;关系 3.实现关系 4.聚合关系 5.组合关系 6.依赖关系 7.关联关系 7.1. 单向关联 7.2. 双向关联 7.3.自关联 8.总结 1.引言 在面向对象设计模式中&#xff0c;类与类之间主要有6种关系&#xff0c;他们分别是&#xff…

Android Studio安装完成后,下载gradle-7.4-bin.zip出现连接超时

文章目录 问题原因&#xff1a;因为下载镜像是谷歌&#xff0c;属于外网&#xff0c;不好正常连接&#xff0c;下载依赖。解决方法&#xff1a;找到gradle-wrapper.properties文件&#xff0c;修改镜像&#xff0c;如下图&#xff0c;然后再单击try again重新下载。 问题原因&a…

[论文阅读]Constrained Decision Transformer for Offline Safe Reinforcement Learning

Constrained Decision Transformer for Offline Safe Reinforcement Learning Proceedings of the 40th International Conference on Machine Learning (ICML), July 23-29, 2023 https://arxiv.org/abs/2302.07351 泛读只需要了解其核心思想即可。 安全强化学习(Safe Rei…

解决 IntelliJ IDEA 中使用 Lombok 编译报错的几种方法

目录 引言 常见的 Lombok 编译错误 解决方法 方法一&#xff1a;确保最新版本 Lombok 库已添加到项目依赖 方法二&#xff1a;检查 IDEA 的编译器设置 方法三&#xff1a;安装并启用 Lombok 插件 方法四&#xff1a;配置 Lombok 注解处理器 方法五&#xff1a;检查 Lom…