设计模式——原型模式05

原型模式核心复制,每次new出来的对象完全不一样,实现对象之间的隔离。 学习前最好先掌握jAVA值传递和深浅拷贝
设计模式,一定要敲代码理解

浅拷贝

克隆出对象,其中两者的引用类型属性是同一个对象。

对象信息

/*** @author ggbond* @date 2024年04月03日 08:38*/
public class Mankind01 implements Cloneable {private  int age;private Date birth;public Mankind01(int age, Date birth){this.age=age;this.birth=birth;}public int getAge() {return age;}public Date getBirth() {return birth;}public void setAge(int age) {this.age = age;}public void setBirth(Date birth) {this.birth = birth;}@Overrideprotected Mankind01 clone() throws CloneNotSupportedException {return (Mankind01) super.clone();}
}

测试

/*** @author ggbond* @date 2024年04月03日 08:42**/
public class test01 {public static void main(String[] args) throws Exception {Date birth=new Date(2022,4,3);int age=25;Mankind01 m1=new Mankind01(age,birth);Mankind01 m2=m1.clone();System.out.println("m1.age:"+m1.getAge()+"  "+"m2.age:"+m2.getAge());System.out.println("m1.birth:"+m1.getBirth()+"  "+"m2.birth:"+m2.getBirth());System.out.println("-----------");age=21; birth.setTime(1232321321L);System.out.println(m1.getBirth() == m2.getBirth()); // trueSystem.out.println("m1.age:"+m1.getAge()+"  "+"m2.age:"+m2.getAge());System.out.println("m1.birth:"+m1.getBirth()+"  "+"m2.birth:"+m2.getBirth());}
}

测试结果发现, m1,m2 中的属性 引用类型 Date birth 是指向同一个对象

m1.age:25  m2.age:25
m1.birth:Wed May 03 00:00:00 CST 3922  m2.birth:Wed May 03 00:00:00 CST 3922
-----------
true
m1.age:25  m2.age:25
m1.birth:Thu Jan 15 14:18:41 CST 1970  m2.birth:Thu Jan 15 14:18:41 CST 1970

在这里插入图片描述

深拷贝

对象信息

/*** @author ggbond* @date 2024年04月03日 08:38*/
public class Mankind02 implements Cloneable {private  int age;private Date birth;public Mankind02(int age, Date birth){this.age=age;this.birth=birth;}public int getAge() {return age;}public Date getBirth() {return birth;}public void setAge(int age) {this.age = age;}public void setBirth(Date birth) {this.birth = birth;}@Overrideprotected Mankind02 clone() throws CloneNotSupportedException {Mankind02 m = (Mankind02) super.clone();m.setBirth((Date) birth.clone());return m;}
}

测试

/*** @author ggbond* @date 2024年04月03日 08:42* 原型模式,本质是克隆复制对象。*/
public class test02 {public static void main(String[] args) throws Exception {Date birth=new Date(2022,4,3);int age=25;Mankind02 m1=new Mankind02(age,birth);Mankind02 m2=m1.clone();System.out.println("m1.age:"+m1.getAge()+"  "+"m2.age:"+m2.getAge());System.out.println("m1.birth:"+m1.getBirth()+"  "+"m2.birth:"+m2.getBirth());System.out.println("-----------");age=21; birth.setTime(123232321L);System.out.println(m1.getBirth() == m2.getBirth()); // trueSystem.out.println("m1.age:"+m1.getAge()+"  "+"m2.age:"+m2.getAge());System.out.println("m1.birth:"+m1.getBirth()+"  "+"m2.birth:"+m2.getBirth());}
}

结果

m1.age:25  m2.age:25
m1.birth:Wed May 03 00:00:00 CST 3922  m2.birth:Wed May 03 00:00:00 CST 3922
-----------
false
m1.age:25  m2.age:25
m1.birth:Fri Jan 02 18:13:52 CST 1970  m2.birth:Wed May 03 00:00:00 CST 3922

在这里插入图片描述

总结

使用场景:需要到大量相同对象,但内部内容或结构可能进行修改。思考上述被复制对象中如果含多层引用,克隆包含循环引用的复杂对象可能会非常麻烦。

代码下载

代码下载

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

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

相关文章

常用的AI绘画自动生成器介绍

AI绘画自动生成器是一种利用人工智能技术生成图像的工具。它可以根据用户输入的文本描述自动生成相应的图像。目前,有几种流行的AI绘画自动生成器,包括: 1. **DALL-E 2** DALL-E 2是由OpenAI开发的AI绘画生成器,它可以根据用户输入的自然语言描述生成高质量的图像。DALL-E 2使…

【Linux】Linux进程学习(基本认知)

🔥博客主页: 小羊失眠啦. 🎥系列专栏:《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞👍收藏⭐评论✍️ 文章目录 前言一、冯诺依曼体系二、系统管理三、进程理解3.1 代码与数据3.2 进程控制块 四…

jvm总结学习

四种加载器 1.启动类加载器 2.拓展类加载器 3.应用程序加载器 4.自定义加载器 沙箱机制 就是为了保证安全,增加的一些权限。 native方法区(静态变量,常量,类信息(构造方法,接口定义)&…

突破!AI机器人拥有嗅觉!仿生嗅觉芯片研究登上Nature子刊

我们一直梦想着让AI与人类能够更加相似,赋予它们视觉与听觉。而让机器人拥有嗅觉一直以来面临着巨大的困难。 香港科技大学范志勇教授领导的研究团队凭借最新研发的仿生嗅觉芯片(BOC)在这一领域取得了重大突破。该研究成果目前已被发表到IF …

github生成新的SSH密钥

首先是参考官方文档 生成新的 SSH 密钥并将其添加到 ssh-agent述 当你在创建SSH密钥时遇到提示: Enter file in which to save the key (/c/Users/YOU/.ssh/id_ALGORITHM):这一步是让你选择保存生成的SSH密钥对的文件名和位置。如果你直接按回车键([Pr…

Qt+OpenGL_part1

OpenGL,Qt实现:1入门篇(已更完)_哔哩哔哩_bilibili OpenGL3.3以上是现代模式(可编程管线): 状态机 状态设置函数(State-changing Function) 状态应用函数 (State-using Function) OpenGL的状态…

Centos7安装minio

下载 官网:MinIO | Code and downloads to create high performance object storage 网盘:链接:https://pan.baidu.com/s/1XTu4WyHrBQbetu5g4oKvAw?pwd7b22 提取码:7b22 将下载的安装文件上传到服务器/opt目录下 安装前准备…

获取天翼网关TEWA-708E超级管理员密码

Download RouterPassView 参考:破解光猫超级管理员密码(网关型号:TEWA-708E) - 知乎

记Kubernetes(k8s)初始化报错:“Error getting node“ err=“node \“k8s-master\“ not found“

记Kubernetes(k8s)初始化报错:"Error getting node" err"node \"k8s-master\" not found" 1、报错详情2、问题排查3、尝试问题解决 💖The Begin💖点点关注,收藏不迷路&#…

14.信号量

一、信号量的简介 信号量是一种解决同步问题的机制,可以实现对共享资源的有序访问。其中,“同步”指的 是任务间的同步,即信号量可以使得一个任务等待另一个任务完成某件事情后,才继续执行; 而“有序访问”指的是对被…

如何打包一个手机软件

目录 前言: 准备工具: 创建项目: 打包程序: 前言: 我们平时手机上使用的程序,或者电脑上使用的程序都可以由Web程序打包而来的,而打包不是一个.html文件也不是一个.js文件而是一个大型的文…

计算机网络——数据链路层(流量传输与可靠传输机制)

计算机网络——数据链路层(流量传输与可靠传输机制) 流量传输与可靠传输机制流量控制可靠传输机制 停止-等待协议无差错情况接收并检测到差错状态确认丢失或迟到状态 停等协议的效率分析后退N帧协议(Go-Back-N,简称GBN&#xff09…

【HarmonyOS】ArkUI - 动画

利用属性动画、显示动画、组件转场动画实现组件动画效果。 一、属性动画 属性动画是通过设置组件的 animation 属性来给组件添加动画,当组件的 width、height、Opacity、backgroundColor、scale、rotate、translate 等属性变更时,可以实现渐变过渡效果。…

AI Kimi:帮助教师做好试卷命题

原文:https://www.toutiao.com/article/7353661304307778083/?log_fromcfd0a50014034_1712243146922 最近,Kimichat工具很火。这款软件不仅仅是一个聊天和阅读工具,还是一个强大的教学辅助工具。作为一位教师,尝试使用Kimichat&…

101. 对称二叉树及同类题

101. 对称二叉树 力扣题目链接(opens new window) 给定一个二叉树,检查它是否是镜像对称的。 递归 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNo…

开源推荐榜【Pear Admin Flask 用python来创建后台管理系统】

最新技术高效快速开发,前后端分离模式,开箱即用。 核心模块包括:用户、角色、职位、组织机构、菜单、字典、日志、多应用管理、文件管理、定时任务等功能。 代码量少、学习简单、功能强大、轻量级、易扩展,轻松开发从现在开始&…

一个线程池的理解

最近看到一个线程池,写的实在太好,于是想深入理解一下。原始代码出处:GitHub - Ahajha/CTPL: Modern and efficient C Thread Pool Library 由于平时的工程一般只支持到C11,而拿到的代码应该是在C20下才能编译通过,因此也做了一些…

第二十三章 Git

一、Git Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版…

MIT6.828实验:Xv6 and Unix utilities

2023MIT6.828 lab-1 官方地址 一、sleep 实验内容 调用sleep(系统调用)编写用户级别程序能暂停特定时常的系统滴答程序保存在user/sleep.c 实验过程 xv6的参数传递 查看官方文档提示的文件中,多采用如下定义: int main(in…