设计模式——原型模式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;
    }

    @Override
    protected 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()); // true
        System.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;
    }

    @Override
    protected 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()); // true
        System.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

在这里插入图片描述

总结

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

代码下载

代码下载

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ps:合并到 HDR Pro

Ps菜单:文件/自动/合并到 HDR Pro Automate/Merge to HDR Pro 合并到 HDR Pro Merge to HDR Pro命令可以将同一场景的具有不同曝光度的多个图像合并起来,从而捕获单个 HDR 图像中的全部动态范围。 合并到 HDR Pro 命令分两步进行。 首先,需要…

Kubernetes(k8s):精通 Pod 操作的关键命令

Kubernetes(k8s):精通 Pod 操作的关键命令 1、查看 Pod 列表2、 查看 Pod 的详细信息3、创建 Pod4、删除 Pod5、获取 Pod 日志6、进入 Pod 执行命令7、暂停和启动 Pod8、改变 Pod 副本数量9、查看当前部署中使用的镜像版本10、滚动更新 Pod11…

车载电子电器架构 —— 软件下载

车载电子电器架构 —— 软件下载 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无…

matlab中角度-弧度转化

在 MATLAB 中进行角度和弧度之间的转换可以使用内置的函数: 1. 将角度转换为弧度: matlab rad deg * pi / 180; 这里 deg 是你想要转换的角度值,pi 是 MATLAB 内置的圆周率常量。 2. 将弧度转换为角度: matlab…

端口映射如何测试?

端口映射是一项网络技术,用于将外部网络中的数据流量映射到内部网络中的特定端口或设备上。通过端口映射,可以实现远程访问内部网络中的设备或应用程序,使其能够在外部网络中得到访问。本文将介绍端口映射测试及其应用场景。 2. 【天联】组网…

MIT6.828实验:Xv6 and Unix utilities

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

代码随想录算法训练营第三十天| 332.重新安排行程, 51. N皇后, 37. 解数独,总结

题目与题解 参考资料:回溯总结 332.重新安排行程 题目链接:332.重新安排行程 代码随想录题解:332.重新安排行程 视频讲解:带你学透回溯算法(理论篇)| 回溯法精讲!_哔哩哔哩_bilibili 解题思路&a…

【随笔】Git 高级篇 -- 相对引用2(十三)

💌 所属专栏:【Git】 😀 作  者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! 💖 欢迎大…

每日一题(leetcode287):寻找重复数--二分查找+思维

思路&#xff1a;看官方解答 class Solution { public:int findDuplicate(vector<int>& nums) {int nnums.size();int left1;int rightn-1;int ans-1;while(left<right){int mid(leftright)/2;int count0;for(int j0;j<n;j){if(nums[j]<mid){count;}}if(co…

小林coding图解计算机网络|基础篇03|Linux 系统是如何收发网络包的?

小林coding网站通道&#xff1a;入口 本篇文章摘抄应付面试的重点内容&#xff0c;详细内容还请移步&#xff1a;小林coding网站通道 文章目录 网络模型Linux 网络协议栈Linux 接收网络包的流程Linux发送网络包的流程为什么全部数据包只用一个结构体来描述呢发送网络数据的时候…

[HackMyVM]靶场Logan2

难度:Medium kali:192.168.56.104 靶机:192.168.56.146 端口扫描 ┌──(root㉿kali2)-[~/Desktop] └─# nmap 192.168.56.146 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-04-04 19:41 CST Nmap scan report for 192.168.56.146 Host is up (0.000067s latency)…

0201基础集成与使用-微信支付-支付模块-项目实战

文章目录 一、前言二、springboot集成2.1 配置信息与配置类2.2 微信相关枚举信息2.3 工具类2.4 业务接口 三、演示-支付与退款结语 一、前言 下面我以微信支付v3为例&#xff0c;通过spirngboot集成到我们的项目中&#xff0c;不依赖其他第三方框架。当然适用简单项目&#xf…

软考--软件设计师(软件工程总结2)

目录 1.测试方法 2.软件项目管理 3.软件容错技术 4.软件复杂性度量 5.结构化分析方法&#xff08;一种面向数据流的开发方法&#xff09; 6.数据流图 1.测试方法 软件测试&#xff1a;静态测试&#xff08;被测程序采用人工检测&#xff0c;计算机辅助静态分析的手段&…

Unity开发之音效相关

目录 音频文件的导入 音频源相关 麦克风输入相关 获取麦克风设备信息 开始录制 获取音频数据用于存储或者传输 代码控制音频源 动态控制音效播放 示例 音频文件的导入 常用格式&#xff1a;wav,mp3,ogg,aiff Force To Mono(多声道转单声道)Normalize(强制为单声道&am…

C++入门 (2) >>引用>>内联函数>>auto关键字

1 引用 定义&#xff1a;给变量起别名。 方法&#xff1a;在类型后面加上&符号。 主要作用&#xff1a;代替函数传指针。 例&#xff1a; void test(int& a) //参数为int&类型 {a 10; }int main() {int m 3;int& z m; //给m起别名叫z&#xff0…

基于springboot+vue+Mysql的在线考试系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

MySQL8,体验不一样的安装方式!

MySQL官网中下载YUM源rpm安装包。 1、把上面的rpm文件下载下来放到服务器上 #或者在linux系统中通过wget命令下载 wget http://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm2、下载完成后使用yum命令本地安装yum源 yum localinstall mysql80-community-rel…

Linux云计算之Linux基础3——Linux基本认识操作

1、终端 终端(terminal)&#xff1a;人和系统交互的必要设备&#xff0c;人机交互最后一个界面&#xff08;包含独立的输入输出设备&#xff09; 物理终端(console)&#xff1a;直接接入本机器的键盘设备和显示器虚拟终端(tty)&#xff1a;通过软件方式虚拟实现的终端。它可以…

IP-guard WebServer 任意文件读取漏洞复现

0x01 产品简介 IP-guard是由溢信科技股份有限公司开发的一款终端安全管理软件,旨在帮助企业保护终端设备安全、数据安全、管理网络使用和简化IT系统管理。 0x02 漏洞概述 由于IP-guard WebServer /ipg/static/appr/lib/flexpaper/php/view.php接口处未对用户输入的数据进行严…

VMamba: Visual State Space Model

VMamba: Visual State Space Model VMamba&#xff1a;视觉状态空间模型 论文链接&#xff1a;http://arxiv.org/abs/2401.10166 代码链接&#xff1a;https://github.com/MzeroMiko/VMamba 1、摘要 借鉴了最近引入的状态空间模型SSM&#xff0c;提出了Visual State Space M…