Gof23设计模式之原型模式

news2024/12/23 9:39:33

1.概述

用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象。

2.结构

原型模式包含一下角色:

  • 抽象原型类:规定了具体原型对象必须实现的clone()方法
  • 具体原型类:实现了抽象圆形类的clone()方法,它是可被复制的对象
  • 访问类:使用具体原型类中的clone()方法来复制新的对象

3.类图

在这里插入图片描述

4.实现

原型模式的克隆分为浅克隆和深克隆。

  • 浅拷贝:创建一个新对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原有属性所指向的对象的内存地址。
  • 深拷贝:创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原有对象地址。

4.1.浅拷贝

/**
 * @author 晓风残月Lx
 * @date 2023/6/25 22:51
 */
public class Citation implements Cloneable {

    // 姓名
    private Student student;

    public Student getStudent() {
        return student;
    }

    public void setStudent(Student student) {
        this.student = student;
    }

    @Override
    public Citation clone() throws CloneNotSupportedException {
        return (Citation) super.clone();
    }

    public void show() {
        System.out.println(student.getName() + "同学,表现挺好,给你个大拇哥,相信我做你自己绝壁泰酷啦");
    }
}
/**
 * @author 晓风残月Lx
 * @date 2023/6/25 22:57
 */
public class Student {

    // 学生姓名
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
/**
 * @author 晓风残月Lx
 * @date 2023/6/25 22:59
 *      浅拷贝的非基本类型属性,扔指向原有属性所指向同一个内存地址
 */
public class CitationTest {
    public static void main(String[] args) throws CloneNotSupportedException {

        Citation citation = new Citation();
        Student student = new Student();
        student.setName("晓风残月Lx");
        citation.setStudent(student);

        Citation clone = citation.clone();
        clone.getStudent().setName("小吕");

        citation.show();
        clone.show();
    }
}

在这里插入图片描述
这个运行结果说明,在CitationTest中克隆后的Citation类中的Student类和原型Citation类中的Student类是同一个内存地址

4.2.深拷贝

深拷贝需要对象流,并且需要实现序列化接口

import java.io.Serializable;

/**
 * @author 晓风残月Lx
 * @date 2023/6/25 22:51
 */
public class Citation implements Cloneable, Serializable {

    // 姓名
    private Student student;

    public Student getStudent() {
        return student;
    }

    public void setStudent(Student student) {
        this.student = student;
    }

    @Override
    public Citation clone() throws CloneNotSupportedException {
        return (Citation) super.clone();
    }

    public void show() {
        System.out.println(student.getName() + "同学,表现挺好,给你个大拇哥,相信我做你自己绝壁泰酷啦");
    }

}
import java.io.Serializable;

/**
 * @author 晓风残月Lx
 * @date 2023/6/25 22:57
 */
public class Student implements Serializable {

    // 学生姓名
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

import java.io.*;

/**
 * @author 晓风残月Lx
 * @date 2023/6/25 22:59
 *      深拷贝需要对象流   里面的对象也就是student不是同一个
 */
public class CitationTest {
    public static void main(String[] args) throws CloneNotSupportedException, IOException, ClassNotFoundException {

        Citation citation = new Citation();
        Student student = new Student();
        student.setName("晓风残月Lx");
        citation.setStudent(student);

        // 创建对象输出流对象
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:\\software\\Java\\IDEA\\workspace\\design_gof23\\b.txt"));
        oos.writeObject(citation);
        oos.close();

        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:\\software\\Java\\IDEA\\workspace\\design_gof23\\b.txt"));
        Citation citation1 = (Citation) ois.readObject();
        citation1.getStudent().setName("小吕");
        ois.close();

        citation.show();
        citation1.show();

    }
}

在这里插入图片描述

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

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

相关文章

Opencv 源码编译以及调用相关

查看Ubuntu上面已经安装的opencv的版本 pkg-config --modversion opencv源码编译 源码下载, 注意其中的batch, 选择一致。 git clone https://github.com/opencv/opencv.git # 下面的仓库为第三方库,可以根据需要选择 git clone https://github.com/o…

npm install --save-dev electron报错

报错: 清除一下缓存,并删除掉node_module npm cache clean --force切换cnpm安装 npm install -g cnpm --registryhttps://registry.npm.taobao.org安装electron cnpm i electron --save-d安装成功!

PHP 音乐网站系统mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP 音乐网站系统 是一套完善的web设计系统,对理解php编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为PHP APACHE,数据库为 mysql5.0,使用php语言开发。 源码…

为按钮和表单绑定事件常用的两种方式

文章目录 前言一、常用事件二、常用事件绑定方式一三、常用事件绑定方式二四、onsubmit()表单事件特别绑定方式4.1 事件绑定方式一使得onsubmit()真正起效 五、常见事件绑定小Bug绑定事件一不规范引发的Bug绑定事件二不规范引发的Bug 前言 在编写代码时,我们难免需要…

VUE使用v-html解析失败和解决方案

有些时候我们拿到后端返回内容进行v-html解析的时候,会发现解析之后,页面展示的还是html内容,我分析了我遇到的情况,希望能帮到大家。 原因:是因为后端返回数据的时候没有对内容进行html做转义,导致页面输出…

爬虫入门指南:学习爬虫的基础知识和技巧

文章目录 爬虫基础知识什么是爬虫?爬虫的工作原理爬虫的应用领域 爬虫准备工作安装Python安装必要的库和工具 网页解析与XPath网页结构与标签CSS选择器与XPathXpath 语法XPath的基本表达式:XPath的谓语(Predicate):XPa…

数据挖掘与数据分析之统计知识篇

1、自由度是什么?怎么确定? 统计学上,自由度是指当以样本的统计量估计总体的参数时,样本中独立或能自由变化的数据个数叫自由度。一般来说,自由度等于独立变量减掉其衍生量数。举例来说,变异数的定义是样本…

Revit U型墩柱的绘制方法和生成柱方法

一、Revit U型墩柱的绘制方法 这里教大家一个墩柱的绘制步骤,我们采用一级等级考试第八期中的U型墩柱试题来给大家演示绘制步骤。 首先我们要明白这里需要采用族样板来绘制,新建一个族样板打开我们的公制常规模型样板 进入立面绘制题目中所需要的参照先&…

java基础(并发编程)-设计模式~同步模式之保护性暂停

一、同步模式之保护性暂停定义 保护性暂停即Guarded Suspension,用在一个线程等待另一个线程的执行结果。 要点 有一个结果需要从一个线程传递到另一个线程,让他们关联到同一个Guarded Object。如果有结果不断从一个线程到另一个线程,那么…

Covex combination和affine combination

Covex combination和affine combination是两种常见的线性组合方法。 Covex combination(凸组合)是指在线性组合中,所有权重(coefficients)取非负值且总和为1的情况。也就是说,对于给定的一组向量或点集合&…

Linux系统编程:详解进程地址空间

目录 一. 进程空间的布局 二. 进程地址空间 2.1 早期CPU访问物理内存的方式 2.2 什么是虚拟地址(进程地址空间) 2.3 操作系统对地址空间的管理方法 三. 地址空间存在的意义 四. 总结 一. 进程空间的布局 在语言层面学习C/C时,根据变量…

android studio 单独运行java 文件

首先&#xff0c;创建一个新的java文件。 然后&#xff0c;在Test.java文件中写上如图所示的代码。 接下来&#xff0c;我们把目录模式从Android转换成Project。 打开.idea文件夹下的gradle.xml文件。 在gradle.xml文件中添加上红色方框中的内容。 <option name"delega…

MySQL GROUP BY 多个字段的用法说明

MySQL GROUP BY 多个字段的用法说明 1. 说明2. 举例附录 1. 说明 在 mysql 中使用 group by 的意思是分组查询。如果 group by 后面跟的是单个字段&#xff0c;那么表示按照这个字段分组查询&#xff0c;如果 group by 后面跟的是多个字段&#xff0c;那么表示按照这些字段的不…

关于使用idea中遇到给Dependencies没有加入jar包,但是在war_exploded中lib有

lib文件夹无jar包 Dependencies无jar包 war_exploded中存在此jar 原因是在此有jar包 当去掉时

深入解析 css.1.5

❑ 控制选择器的优先级。 ❑ 不要混淆层叠和继承。 ❑ 某些属性会被继承&#xff0c;包括文本、列表、表格边框相关的属性。 ❑ 不要混淆initial和auto值。 initial是一个CSS属性的初始值&#xff0c;它会将属性的值重置为浏览器默认值。例如&#xff0c;如果将background-co…

其实失败才是人生常态,赢者通吃确实存在,但那不代表绝大多数人。

其实失败才是人生常态&#xff0c;赢者通吃确实存在&#xff0c;但那不代表绝大多数人。 &#x1f4e2;今年的就业难度可能是之前5年最难的一年&#xff0c;也有可能是以后5年最好的一年。 &#x1f4e2;&#x1f4e2;疫情的回落&#xff0c;仿佛只带动了旅游业的发展&#x…

在EasyCVR中调用快照接口返回404是什么原因?如何解决?

EasyCVR视频融合平台基于云边端一体化架构&#xff0c;能在复杂的网络环境中将前端设备进行统一集中接入&#xff0c;实现视频资源的汇聚管理、直播鉴权、转码处理、多端分发、智能告警、数据共享等能力与服务。此外&#xff0c;平台也提供了丰富的API接口供用户自由调用、集成…

【XKCD】XKCD 风格的图像

目录 1. XKCD 2. 实战 1. XKCD xkcd是一种风格独特的漫画风格&#xff0c;以幽默、讽刺、科学和技术为主题。这种风格通常采用简单的线条和草图&#xff0c;表达出作者的思考和观点。xkcd的图像经常涉及科学、数学、计算机科学、社会和文化问题&#xff0c;以及作者个人的生…

181_带你体验 Power BI 开发者模式 pbip

181_带你体验 Power BI 开发者模式 pbip 一、背景 如果你是一个 Power BI 重度用户&#xff0c;你是不是也有如下的情况&#xff1f; 是的&#xff0c;Power BI 的版本控制全靠复制一份重命名来实现&#xff0c;而且版本之间的特点和差异时间久了就不记得了&#xff0c;还要加…

人工智能将怎样改变未来?TVP读书会带你探索!

引言 数十年前&#xff0c;图灵抛出的时代之问“机器能思考吗&#xff1f;”&#xff0c;将 AI 从科幻拉至现实&#xff0c;随着无数计算机科学先驱的共同努力&#xff0c;人工智能已经发展为引领未来的战略性技术。 AI 无处不在&#xff0c;智能时代触手可及&#xff0c;从 NL…