设计模式之原型模式讲解

原型模式本身就是一种很简单的模式,在Java当中,由于内置了Cloneable 接口,就使得原型模式在Java中的实现变得非常简单。UML图如下:

我们来举一个生成新员工的例子来帮助大家理解。

import java.util.Date;
public class Employee implements Cloneable {private String id;private String name;private Date hireDate;private transient Address address; // 注意:transient关键字表示此字段不参与序列化,这里假设地址不需要深拷贝public Employee(String id, String name, Date hireDate, Address address) {this.id = id;this.name = name;this.hireDate = (Date) hireDate.clone(); // 防止原始hireDate被修改this.address = address;}public String getId() {return id;}public String getName() {return name;}public Date getHireDate() {return (Date) hireDate.clone(); // 返回原始hireDate的副本}public Address getAddress() {return address;}// 重写Object的clone方法,实现浅拷贝@Overridepublic Employee clone() throws CloneNotSupportedException {Employee clonedEmployee = (Employee) super.clone();// 如果有引用类型字段需要深拷贝,需要在这里进行额外处理// 例如,如果Address也需要深拷贝,可以添加如下代码:// clonedEmployee.address = address.clone();return clonedEmployee;}
}
class Address implements Cloneable {private String street;private String city;private String country;public Address(String street, String city, String country) {this.street = street;this.city = city;this.country = country;}// 提供Address的克隆方法实现深拷贝public Address clone() {return new Address(street, city, country);}// ... getters and setters ...
}
public class PrototypeDemo {public static void main(String[] args) {try {// 创建原始员工对象Address address = new Address("123 Main St", "Anytown", "USA");Employee original = new Employee("001", "John Doe", new Date(), address);// 使用clone方法创建新员工对象Employee cloned = original.clone();// 修改克隆对象的属性,验证克隆是否成功cloned.setName("Jane Doe");cloned.getAddress().setCity("Another City");System.out.println("Original Employee:");System.out.println("ID: " + original.getId());System.out.println("Name: " + original.getName());System.out.println("Hire Date: " + original.getHireDate());System.out.println("Address: " + original.getAddress());System.out.println("\nCloned Employee:");System.out.println("ID: " + cloned.getId());System.out.println("Name: " + cloned.getName());System.out.println("Hire Date: " + cloned.getHireDate());System.out.println("Address: " + cloned.getAddress());} catch (CloneNotSupportedException e) {e.printStackTrace();}}
}

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

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

相关文章

【科研基础】VAE: Auto-encoding Variational Bayes

[1]Kingma, Diederik P., and Max Welling. “Auto-encoding variational bayes.” arXiv preprint arXiv:1312.6114 (2013). [2] [论文简析]VAE: Auto-encoding Variational Bayes[1312.6114] [3] The Reparameterization Trick [4] 变分法的基本原理是什么? 文章目录 1-…

SMMU学习这一篇就够了

快速链接: 【精选】ARMv8/ARMv9架构入门到精通-[目录] 👈👈👈 引流关键词: SMMU,mmu500,mmu600,mmu700,system mmu,Non-cacheable,Cacheable, non-shareable,inner-shareable,outer-shareable, optee、ATF、TF-A、Trustzone、opte…

基于单片机HX711电子秤称重控制设计

**单片机设计介绍,基于单片机HX711电子秤称重控制设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机HX711的电子秤称重控制设计是一个融合了单片机技术、称重传感器技术和显示技术的综合性项目。其设计目…

Docker 夺命连环 15 问

目录 什么是Docker? Docker的应用场景有哪些? Docker的优点有哪些? Docker与虚拟机的区别是什么? Docker的三大核心是什么? 如何快速安装Docker? 如何修改Docker的存储位置? Docker镜像常…

HTML5+CSS3+JS小实例:原生JS实现全屏滚动

实例:原生JS实现全屏滚动 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial…

网络socket编程(一)——socket接口函数、面向数据报的UDP编程及测试、select函数应用

目录 一、socket简介 二、socket编程接口函数介绍 2.1 socket()函数&#xff08;创建socket&#xff09; 2.2 bind()函数&#xff08;绑定地址和端口&#xff09; 2.3 listen()函数&#xff08;设置socket为监听模式&#xff09; 2.4 accept()函数&#xff08;接受连接…

原子增强类(18罗汉)

LongAdder对象要比AtomicLong性能更好&#xff08;减少乐观锁次数&#xff09; LongAdder常用API LongAdder 只能用来计算加法且只能从0开始 LongAccumulator 提供了自定义函数操作 点赞高并发案例 调用&#xff1a; 测试结果&#xff1a; 原理分析&#xff0c;为什么能更快…

使用OpenHarmony实现一个简易的音乐播放器应用

介绍 本篇Codelab使用ArkTS语言实现了一个简易的音乐播放器应用&#xff0c;主要包含以下功能&#xff1a; 播放应用中的音频资源文件&#xff0c;并可进行上一曲、下一曲、播放、暂停、切换播放模式&#xff08;顺序播放、单曲循环、随机播放&#xff09;等操作。结合后台任…

大数据Hadoop生态圈体系视频课程

课程介绍 熟悉大数据概念&#xff0c;明确大数据职位都有哪些&#xff1b;熟悉Hadoop生态系统都有哪些组件&#xff1b;学习Hadoop生态环境架构&#xff0c;了解分布式集群优势&#xff1b;动手操作Hbase的例子&#xff0c;成功部署伪分布式集群&#xff1b;动手Hadoop安装和配…

欧拉系统部署ftp服务器

1.先检查是否已经安装ftp vsftpd -v 2.安装vsftpd yum install vsftpd 3.修改ftp配置文件 vim /etc/vsftpd/vsftpd.conf 4.启动ftp systemctl start vsftpd 5.查看是否启动 systemctl status vsftpd 6.设置为开机自启 systemctl enable vsftpd 7.查看端口是否开启 net…

9.windows ubuntu 子系统,centrifuge:微生物物种分类。

上次我们用了karken2和bracken进行了物种分类&#xff0c;这次我们使用centrifuge. Centrifuge 是一种用于快速和准确进行微生物分类和物种鉴定的软件。其主要功能包括&#xff1a; 快速分类和物种鉴定: Centrifuge 可以对高通量测序数据&#xff08;如 metagenomic 或 RNA-Se…

【差分约束+并查集】第十三届蓝桥杯省赛C++ A组 Java A组/研究生组《推导部分和》(C++)

【题目描述】 【输入格式】 【输出格式】 【数据范围】 【输入样例】 5 3 3 1 5 15 4 5 9 2 3 5 1 5 1 3 1 2 【输出样例】 15 6 UNKNOWN 【思路】 题解来源&#xff1a;AcWing 4651. $\Huge\color{gold}{推导部分和}$ - AcWing 【代码】 #include<bits/stdc.h> #define…