Java设计模式 _创建型模式_原型模式(Cloneable)

一、原型模式

1、原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能比较好。一般对付出较大代价获取到的实体对象进行克隆操作,可以提升性能。

2、实现思路:
(1)、需要克隆的实体类实现Cloneable接口
(2)、复写clone方法(当前对象本身可以不复写,如果当前对象被继承,需要clone子类,则必须要复写)

二、代码示例

1、基础示例:

import lombok.Data;
@Data
public class Rose implements Cloneable {private String name;public static void main(String[] args) throws CloneNotSupportedException {Rose rose = new Rose();rose.setName("玫瑰");System.out.println(rose);Rose clone = (Rose)rose.clone();System.out.println(clone);System.out.println(rose==clone);}
}

上运行结果:
在这里插入图片描述
可以看出,完整的复制了属性,且并不是同一个对象。实现了Cloneable接口的类可以直接用clone方法。

2、继承示例:

// 花抽象类
import lombok.Data;
@Data
public  abstract class Flower implements Cloneable{protected String name;public abstract String desc();public Object clone() {Object clone = null;try {clone = super.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();}return clone;}
}
// 牡丹花类
public class Peony extends Flower {public Peony(){this.name = "peony";}@Overridepublic String desc() {return "牡丹花";}
}// 梅花类
public class Plum extends Flower {public Plum(){this.name = "plum";}@Overridepublic String desc() {return "梅花";}
}
// 测试类
public class Ztest {public static void main(String[] args) {Flower plum = new Plum();System.out.println(plum);Flower clone = (Flower) plum.clone();System.out.println(clone);System.out.println(plum==clone);}
}

运行结果:
在这里插入图片描述
可以看到运行结果,可以看到完成克隆,且并非同一个对象。子类在调用clone方法时,抽象父类中必须重写,否则无法调用。

学海无涯苦作舟!!!

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

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

相关文章

python中怎么注释多行

多行代码注释 方法一:先选中要注释的段落,然后按下“ctrl/”,即可实现多行代码的注释。效果如下: 再一次按下“ctrl/”就可以取消注释。 方法二:跟注释单行一样在每一行前面输入“shift#”。 #r(i-arr[idx])*rat[idx]…

62、回溯-N皇后

思路: N皇后问题要求在一个nn的棋盘上放置n个皇后,使得它们不能相互攻击。皇后可以攻击同一行、同一列,以及两个对角线方向上的其他皇后。解决这个问题意味着找到所有可能的棋盘配置,每个配置都符合上述条件。 1、初始化数据结构…

【iconv】Linux c++ 中文字符串转十六进制 GBK 编码/内码

文章目录 问题描述c 代码CMakeLists.txt参考链接 问题描述 Linux 系统默认使用的是 UTF-8 编码,并且 c 中没有标准库可以直接将中文字符转为 GBK 编码/内码。因此需要借助 iconv 库来实现。 在实现代码之前,可以在一下在线工具网站进行中文字符到各个编…

【Webgl_glslThreejs】搬运分享shader_飘落心形

来源网站 https://www.shadertoy.com/view/4sccWr效果预览 代码演示 将shadertory上的代码转成了threejs可以直接用的代码,引入文件的material,并在创建mesh或已有物体上使用material即可,使用时请注意uv对齐。 import { DoubleSide, Shad…

【Day 9】Mybatis CURD + XML 映射 + 动态 SQL

1 Mybatis 基础操作 下面进行:增删改查——C(create)U(update)R(retrieve)D(delete) 1.1 删除(删) 根据主键 id 进行删除 注意 占位符 #{ } 返回值是删除的记录条数 测试: 可以在日志中看到 mybatis 具体的语句 预编译 SQL 的优…

项目管理系统(PMS):一文扫盲,再也不用担心质量和延期了。

一、什么是PMS系统 项目管理系统(PMS)是一种软件工具或平台,用于帮助组织和团队有效地规划、执行和监控项目。PMS系统提供了一系列功能和工具,以支持项目管理的各个方面,包括项目计划、进度跟踪、资源管理、任务分配、…

Android Studio 报错:AVD Pixel_3a_API_30_x86 is already running

在我的Android Studio和虚拟机运行时,我的电脑不小心关机了,在启动后再次打开Android Studio并运行虚拟机时发现报错。 Error while waiting for device: AVD Pixel_3a_API_30_x86 is already running. If that is not the case, delete the files at C…

【Docker】Docker 实践(一):在 Docker 中部署第一个应用

Docker 实践(一):在 Docker 中部署第一个应用 1.使用 YUM 方式安装 Docker2.验证 Docker 环境3.在 Docker 中部署第一个应用3.1 小插曲:docker pull 报 missing signature key 错误3.2 重新安装 Nginx 1.使用 YUM 方式安装 Docker…

C++链表操作入门

数据结构基础:链表操作入门 数据结构基础:链表操作入门链表的基本概念链表的基本操作输出链表插入节点删除节点查找值 完整的链表操作示例结语 数据结构基础:链表操作入门 在计算机科学中,数据结构是组织和存储数据的方式&#x…

Redis高级篇详细讲解

0.今日菜单 Redis持久化【理解】 Redis主从 Redis哨兵 Redis分片集群【运维】 单点Redis的问题 数据丢失问题:Redis是内存存储,服务重启可能会丢失数据 并发能力问题:单节点Redis并发能力虽然不错,但也无法满足如618这样的高…

构建安全高效的前端权限控制系统

✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天开心哦!✨✨ 🎈🎈作者主页: 喔的嘛呀🎈🎈 ✨✨ 帅哥美女们,我们共同加油!一起进步&am…

insightface 环境配置

首先创建续集环境: conda create -n insightface3 python3.8 然后打开此虚拟环境:conda activate insightface3 然后安装: pip install insightface 再安装:pip install onnxruntime-gpu 就可以了