设计模式(6)原型模式

一、介绍

Java中自带的原型模式是clone()方法。该方法是Object的方法,native类型。他的作用就是将对象的在内存的那一块内存数据一字不差地再复制一个。我们写简单类的时候只需要实现Cloneable接口,然后调用Object::clone方法就可实现克隆功能。这样实现的方式是浅拷贝。

 1、深复制与浅复制:

(1)浅复制:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象;

//原型类
public class Resume implements Cloneable,Serializable{
    private static final long serialVersionUID = 1L;
 
    private String name;
    private String sex;
    private String age;
 
    Resume(String name,String sex,String age){
        this.name=name;
        this.sex=sex;
        this.age=age;
    }
 
    /**
     * 设置个人信息
     * @param sex
     * @param age
     */
    public void setPersonInfo(String sex,String age){
        this.sex=sex;
        this.age=age;
    }
 
    //描述
    public void dispaly(){
        System.out.println("姓名:"+name+"\t年龄:"+age+"\t性别:"+sex);
    }
 
    public Object clone(){
        try {
            Resume resume = (Resume)super.clone();
            return resume;
        }catch (Exception e){
            return null;
        }
 
    }
 
}

  客户端:

public class MainTest {
    public static void main(String[] args){
 
        Resume resume = new Resume("大鸟","男","25");
 
        Resume resume2 = (Resume)resume.clone();
        resume2.setPersonInfo("男","26");
 
        resume.dispaly();
        resume2.dispaly();
 
    }
}

 (2)深复制:把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。

      新增对象类

public class WorkExperience implements Cloneable{
 
    private String workDate;
    private String company;
 
    public WorkExperience(String workDate,String company){
        this.workDate=workDate;
        this.company=company;
    }
 
    public WorkExperience(){}
 
    /**省略set、get方法*/
 
 
    public Object clone(){
        try {
            return super.clone();
        }catch (Exception e){
            return null;
        }
 
    }
 
}
public class Resume implements Cloneable,Serializable{
    private static final long serialVersionUID = 1L;
 
    private String name;
    private String sex;
    private String age;
    private WorkExperience workExperience;
 
    Resume(String name,String sex,String age){
        this.name=name;
        this.sex=sex;
        this.age=age;
        this.workExperience=new WorkExperience();
    }
 
    /**
     * 添加私有构造 克隆工作经历
     * @param workExperience
     */
    private Resume(WorkExperience workExperience){
        this.workExperience= (WorkExperience) workExperience.clone();
    }
 
    /**
     * 设置个人信息
     * @param sex
     * @param age
     */
    public void setPersonInfo(String sex,String age){
        this.sex=sex;
        this.age=age;
    }
 
    /**
     * 设置工作经历
     * @param workDate
     * @param company
     */
    public void setWorkExperience(String workDate, String company){
        this.workExperience.setWorkDate(workDate);
        this.workExperience.setCompany(company);
    }
 
    //描述
    public void dispaly(){
        System.out.println("姓名:"+name+"\t年龄:"+age+"\t性别:"+sex);
        System.out.println("工作经历:"+workExperience.getWorkDate()+"\t"+workExperience.getCompany());
    }
 
    /**
     * 重写了克隆方法
     * @return
     */
    public Object clone(){
        try {
            Resume resume = new Resume(this.workExperience);//调用私有构造器实现工作经历克隆
            //给对象属性重新赋值--最终返回的是深复制的resume对象
            resume.name=this.name;
            resume.sex=this.sex;
            resume.age=this.age;
            return resume;
        }catch (Exception e){
            return null;
        }
 
    }
 
}

 客户端

public class MainTest {
    public static void main(String[] args){
 
        Resume resume = new Resume("大鸟","男","25");
        resume.setWorkExperience("2015-2016","南京工作");
 
        Resume resume2 = (Resume)resume.clone();
        resume2.setPersonInfo("男","26");
        resume2.setWorkExperience("2016-2018","上海工作");
 
        resume.dispaly();
        resume2.dispaly();
 
    }
}

二、应用:

1、数据集对象DataSet,有Clone()方法和Copy()方法,Clone用于复制结构而不复制数据,实现了原型模式的浅复制;Copy不但复制结构也复制数据,实现了原型模式的深复制。

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

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

相关文章

SpringBoot携带Jdk绿色部署项目

文章目录 SpringBoot携带Jdk绿色部署运行项目1. 实现步骤2. 自测项目文件目录及bat文件内容,截图如下:2-1 项目文件夹列表:2-2. bat内容 SpringBoot携带Jdk绿色部署运行项目 说明: 实际应用的不方便场景:1. 实际项目…

Centos7.9系统_亲测成功_磁盘满了_分区和挂载新盘_创建文件夹并挂载分区---Linux工作笔记057

由于在某些部署环境下,运维管理员,仅仅是给分配一些硬盘容量,但是并没有进行分区和挂载到对应的合适的目录下,因此这个时候就需要我们自己去处理了. 这个是自己亲测成功的:由于是后面记录的,尽量记录详细 free -h 查看一下内存情况 df -h查看 硬盘的使用情况,还有是否有没挂载…

【博客692】grafana如何解决step动态变化时可能出现range duration小于step

grafana如何解决step动态变化时可能出现range duration小于step 1、grafana中的step和resolution grafana中的 “step” grafana本身是没有提供step参数的,因为仪表盘根据查询数据区间以及仪表盘线条宽度等,对于不同查询,相同的step并不能…

实例 -- Loadrunner实现Android / IOS 手机APP压力测试

随着手机APP用户量的增大,大的手机APP一般都需要进行压力测试,这几天用了Loadrunner 12进行了手机APP的压力测试,整理了下,大家可以参考参考怎样给Andorid / IOS手机APP进行压力测试,以下是操作实例。 先前我的一个帖…

Spring MVC 简介

目录 1. 什么是MVC2. 什么是SpringMVC 1. 什么是MVC MVC是一种常用的软件架构模式。可以看作是一种设计模式,也可以看作是一种软件框架。经典MVC模式中,M是指模型,V是视图,C则是控制器,使用MVC的目的是将M和V的实现代…

mysql8和mysql5的安装过程都有!!!超多图超详细保姆级教程最新教程新手小白轻松上手,带你了解清楚你安装过程的每一个术语

目录 前言mysql5和mysql8的区别1.官网下载2.mysql8的安装2.1安装程序打开前2.2Choosing a Setup Type选择安装模式2.3Select Products选择组件2.3.1Select Products的组件解释2.3.2Select Products的组件选择2.3.3电脑操作系统位数查看2.3.4Select Products的组件的内容配置2.3…

Stable Diffuion webui Mac版本安装过程

系统环境 操作系统:MacOS Ventura13.5 芯片:Apple M2 Max Python: 3.10 安装前置准备 git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git注意事项:修改源码内全部 git clone 链接,设置代理 https://ghpr…

PyTorch翻译官网教程-NLP FROM SCRATCH: CLASSIFYING NAMES WITH A CHARACTER-LEVEL RNN

官网链接 NLP From Scratch: Classifying Names with a Character-Level RNN — PyTorch Tutorials 2.0.1cu117 documentation 使用CHARACTER-LEVEL RNN 对名字分类 我们将建立和训练一个基本的字符级递归神经网络(RNN)来分类单词。本教程以及另外两个“from scratch”的自然…

虚拟机/双系统Ubuntu扩容

虚拟机Ubuntu扩容 1.需要删除所有的快照 2.扩展虚拟机磁盘大小 虚拟机(M)→设置(s)→硬盘(SCSI)→扩展磁盘容量 3.Ubuntu内调整分区大小 安装gparted分区工具:sudo apt-get install gparted 启动gparted并resize分区 4.最后最好建一个快照,不然gg了…

JavaWeb 中对 HTTP 协议的学习

HTTP1 Web概述1.1 Web和JavaWeb的概念1.2 JavaWeb技术栈1.2.1 B/S架构1.2.2 静态资源1.2.3 动态资源1.2.4 数据库1.2.5 HTTP协议1.2.6 Web服务器 1.3 Web核心 2 HTTP2.1 简介2.2 请求数据格式2.2.1 格式介绍2.2.2 实例演示 2.3 响应数据格式2.3.1 格式介绍2.3.2 响应状态码2.3.…

windows任务栏右下角不显示网络图标解决方法

1、背景 我运行windows诊断服务之后,然后重启了一把电脑,结果发现电脑无法上网了,进一步发现任务栏右下角的网络显示图标也没有了,网络状态显示也是一条横线。 几经折腾终于给解决了,遇到了不少坑,记录一…

【软件工程】数据流图/DFD概念符号/流程图分层/数据字典

【软件工程】数据流图/DFD概念符号/流程图分层/数据字典 目录 【软件工程】数据流图/DFD概念符号/流程图分层/数据字典 一、数据流图 ( DFD ) 简介 二、数据流图 ( DFD ) 概念符号 1、数据流 2、加工 ( 核心 ) 3、数据存储 4、外部实体 三、数据流图 ( DFD ) 分层 1、…

Java AWT Swing(图形化界面编程)(一)

目录 1.简介 2.Java中的图像化界面----Awt与Swing 一、AWT编程 1.简介 2.AWT的继承体系 3.container容器 3.1container继承体系 3.2.常见API 3.3容器演示一 3.4容器演示二 3.5容器演示三 1.简介: 通常情况下,java语言一般是用来开发后台程序的&#xff0…

vue基础知识二:你对SPA单页面的理解,它的优缺点分别是什么?如何实现SPA应用呢

一、什么是SPA SPA(single-page application),翻译过来就是单页应用SPA是一种网络应用程序或网站的模型,它通过动态重写当前页面来与用户交互,这种方法避免了页面之间切换打断用户体验在单页应用中,所有必…

Linux查看GPU显卡/CPU内存/硬盘信息

显卡信息命令/CPU内存/硬盘 1.显卡2、CPU内存3、硬盘 1.显卡 nvidia-smi nvidia-smi(显示一次当前GPU占用情况) nvidia-smi -l(每秒刷新一次并显示) watch -n 5 nvidia-smi (其中,5表示每隔6秒刷新一次终端…

10.pod资源限制和健康检查

文章目录 资源限制探针(健康检查)启动、退出动作总结 资源限制 当定义 Pod 时可以选择性地为每个容器设定所需要的资源数量。 最常见的可设定资源是 CPU 和内存大小,以及其他类型的资源。当为 pod 中的容器指定了 request 资源时&#xff0c…

Python中的dataclass:简化数据类的创建

Python中的dataclass是一个装饰器,用于自动添加一些常见的方法,如构造函数、__repr__、__eq__等。它简化了创建数据类的过程,减少了样板代码,提高了代码的可读性和可维护性。有点类似java里面的Java Bean。 让我们看一个简单的例子…

Linux: network: tools: tcpdump,抓取vlan包需要注意的事情;不然会出现LLC协议

https://bugzilla.redhat.com/show_bug.cgi?id498981#c4 https://serverfault.com/questions/544651/vlan-tags-not-shown-in-packet-capture-linux-via-tcpdump 如果不加-e参数,抓取不到 vlan信息,会导致wireshark解析出现问题。因为,抓到…

keil下载程序具体过程:概述

一、前言 keil下载程序具体过程将由一系列的博客组成,将深入探讨keil这种IDE下载镜像文件时具体做了哪些事情。我们平常下载镜像的时候,只是点击了一下Download按钮,剩下的都由keil替代我们完成了。本系列博客将揭示这一过程,keil…

pytest fixture 高级使用

一、fixture中调用fixture 举例: 输出: 说明:登录fixture 作为参数传递到登出方法中,登录方法的返回值就可以被登出方法使用 二、在fixture中多参数的传递(通过被调用函数传参) 举例: 输出&a…