创建型模式-原型模式

news2024/9/21 19:04:32

原型模式

介绍

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

结构

原型模式包含如下角色:

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

原型模式

实现

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

浅克隆:创建一个新对象,新对象的属性和原对象完全相同,对于非基本类型属性,仍指向原有属性所指向的对象的内存地址。

深克隆:创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原有对象地址

浅克隆类似 “快捷方式”,深克隆才是真正的 “复制文件”。

Java 中的 Object 类中提供了 clone() 方法来实现浅克隆

Java 中的 Cloneable 接口是上面类图中的抽象原型类,而实现了 Cloneable 接口的子实现类就是具体的原型类

RealizeType:具体原型类

public class RealizeType implements Cloneable{
    public RealizeType(){
        System.out.println("具体的原型对象创建完成!");
    }

    @Override
    public RealizeType clone() throws CloneNotSupportedException {
        System.out.println("具体原型复制成功!");
        return (RealizeType) super.clone();
    }
}

ProtoTypeTest:测试访问类

public class ProtoTypeTest {
    public static void main(String[] args) throws CloneNotSupportedException {
        RealizeType realizeType = new RealizeType();
        RealizeType clone = realizeType.clone();
        System.out.println("原型对象与克隆对象是同一个对象?" + (realizeType == clone));
    }
}

输出结果

具体的原型对象创建完成!
具体原型复制成功!
原型对象与克隆对象是同一个对象?false

案例

使用原型模式生成 “三好学生” 奖状

同一学校的 “三好学生” 奖状除了获奖人姓名不同,其他都相同,可以使用原型模式复制多个“三好学生”奖状出来,然后修改奖状上的名字即可。

类图如下:
在这里插入图片描述

奖状类

public class Citation implements Cloneable{
    public Citation(){
        System.out.println("创建奖状原型");
    }
    private String name;

    public String getName() {
        return name;
    }

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

    @Override
    protected Citation clone() throws CloneNotSupportedException {
        System.out.println("复制奖状原型...");
        return (Citation) super.clone();
    }

    public void show() {
        System.out.println(name + "同学:在2023学年第一学期中表现优秀,被评为三好学生。特发此状!");
    }
}

访问测试类

public class CitationTest {
    public static void main(String[] args) throws CloneNotSupportedException {
        Citation citation = new Citation();
        Citation citation1 = citation.clone();
        citation.setName("程哥");
        citation1.setName("赵欢");
        citation.show();
        citation1.show();
    }
}

输出

创建奖状原型
复制奖状原型...
程哥同学:在2023学年第一学期中表现优秀,被评为三好学生。特发此状!
赵欢同学:在2023学年第一学期中表现优秀,被评为三好学生。特发此状!

使用场景

以下两种情况,可以使用原型模式快捷的创建对象:

  • 对象的创建非常复杂。
  • 性能和安全要求比较高

如何实现深拷贝?

使用对象流

public class CitationTest {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        Citation citation = new Citation();
        Student student = new Student();
        student.setName("张三");
        citation.setStudent(student);
        //深拷贝原型对象
        FileOutputStream stream = new FileOutputStream("C:/cit.txt");
        ObjectOutputStream outputStream = new ObjectOutputStream(stream);
        outputStream.writeObject(citation);
        outputStream.close();
        System.out.println("写入完成");
        FileInputStream inputStream = new FileInputStream("C:/cit.txt");
        ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
        Citation citation1 = (Citation) objectInputStream.readObject();
        objectInputStream.close();
        citation1.getStudent().setName("李四");
        citation.show();
        citation1.show();
    }
}

注意:需要被拷贝的对象与引用对象都需要实现Serializable接口

输出

创建奖状原型
写入完成
张三同学:在2023学年第一学期中表现优秀,被评为三好学生。特发此状!
李四同学:在2023学年第一学期中表现优秀,被评为三好学生。特发此状!

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

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

相关文章

Linux文本处理三大利器Grep、AWK、Sed

写在前面 Linux三剑客是文本处理工具,它们可以帮助我们快速、高效地对文本进行处理。其中包括了grep、awk、以及sed这三个强大的命令行工具。 Linux 三剑客主要作用: grep,它可以根据正则表达式查找相关内容并打印对应的数据。awk,它可以根…

redhat8配置vsftpd服务

目录 一、匿名访问模式 1.1、ftp服务器端修改配置(配置文件:/etc/vsftpd/vsftpd.conf) 1.2 修改ftp目录的权限 1.3 设置selinux服务对ftp服务的访问规则策略为允许 1.4 防火墙添加ftp服务 1.5 测试 二、本地用户模式 2.1 服务端修改配…

6、什么是类型断言?

虽然 TypeScript 很强大,但有时还不如我们了解一个值的类型方便,这时候我们更希望 TypeScript 不要帮我们进行类型检查,而是交给我们自己来,所以就用到了类型断言。类型断言有点像是一种类型转换,它把某个值强行指定为…

Vue收集表单数据学习笔记

收集表单数据 v-model双向数据绑定,收集的是input框的value,单选按钮不存在value,就像代码中的男女选项,即使绑定性别v-model“sex”,控制台依然不能接收性别的值,因为没有value值,&#xff0c…

python 第二章——数据类型详解

文章目录 前言一、什么是数据类型1.变量2.注释 二、数字三、字符串四、布尔五、列表六、元组七、集合八、字典总结 前言 本系列教程目录,可点击这里查看:Python教程目录 学习一门编程语言,第一件事就应该是熟练掌握这门编程语言的基本数据类…

[Java]JavaWeb开发中的MVC设计模式

一、有关Java Web与MVC设计模式 学习过基本Java Web开发的人都已经了解了如何编写基本的Servlet,如何编写jsp及如何更新浏览器中显示的内容。但是我们之前自己编写的应用一般存在无条理性,对于一个小型的网站这样的编写没有任何问题,但是一但…

MCDF代码详解,mcdf_rgm_pkg.sv代码超详细注释

寄存器模块代码详解 好戏开始: `include "param_def.v" package mcdf_rgm_pkg; import uvm_pkg::*; `include "uvm_macros.svh" import reg_pkg::*; //具有uvm_reg类型的专用寄存器描述[write-red-reg] class ctrl_reg extends uvm_r…

机器人教学中游戏化课程案例尝试

本文内容严格按创作模板发布: 2023年LPL春季赛季后赛正在火热进行中,你们心中的总冠军是哪支队伍呢?作为热爱游戏的程序猿,一起来聊聊你那些有意义的游戏开发经历吧! 游戏化ROS机器人课程的优势有以下七点&#xff1a…

第3章-运行时数据区

此章把运行时数据区里比较少的地方讲一下。虚拟机栈,堆,方法区这些地方后续再讲。 转载https://gitee.com/youthlql/JavaYouth/tree/main/docs/JVM。 运行时数据区概述及线程 前言 本节主要讲的是运行时数据区,也就是下图这部分&#xff0c…

5.微服务项目实战---Gateway--服务网关,实现统一认证、鉴权、监控、路由转发等

5.1 网关简介 大家都都知道在微服务架构中,一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用 这么多的微服务呢?如果没有网关的存在,我们只能在客户端记录每个微服务的地址,然后分别去调用。 这样的架构&#xff0…

用友联合7家信创生态伙伴成立“信创领先实践联盟”,助力企业数智化国产替代

数字经济背景下,面对国际局势不稳定等以切不确定因素,只有突破和掌握关键核心技术,打造生态话语权,掌握产业发展主动权,向产业价值链高端迈进,我国才能摆脱受制于人局面。而推动信创产业繁荣发展&#xff0…

SAP-选择实施离散制造模式还是重复制造模式?

Implement Discrete Manufacturing or Repetitive Manufacturing? 翻译一篇,反正我也写不出来~~~~ “狗还是猫?” 这可能是世界上第二难的问题。 想知道最难的是什么? 这里是: “实施离散制造还是重复制造?” 作…

【设计模式】我终于读懂了访问者模式。。。

🌰测评系统的需求 将观众分为男人和女人,对歌手进行测评,当看完某个歌手表演后,得到他们对该歌手不同的评价(评价 有不同的种类,比如 成功、失败 等)传统方案 🌱传统方式的问题分析 如果系统比较小&…

2023年面试题入门篇和进阶篇万余字题目总结【答案+解析】

2023年Java面试题入门篇和进阶篇总结【答案解析】 入门篇1.、下列代码输出结果是()2.x为float类型,y为double类型,a为int类型,b为long类型,c为char类型,问xy*a/xb/ac的值是什么类型3.下列哪种说法是正确的4.mysql表use…

rollup打包封装的js类库

rollup中文网:简介 | rollup.js 中文文档 | rollup.js中文网Rollup 是一个 JavaScript 模块打包器,可以将小块代码编译成大块复杂的代码,Rollup 对代码模块使用新的标准化格式,这些标准都包含在 JavaScript 的 ES6 版本中。https:…

postman解决报错填坑指南

postman报错问题处理总结 问题1:如何解决postman请求异常丢掉proxy开头header自动使用系统环境变量代理问题描述:postman请求,配置了proxy开头的header,但是发请求的时候没有携带,可以查看postman的View-Show Postman …

D. Frets On Fire(二分 + 前缀和)

Problem - D - Codeforces Miyako带着一个乌克丽丽来到跳蚤王国。她与当地的跳蚤居民成为好朋友,并每天为他们演奏美妙的音乐。 作为国报,跳蚤们为她制作了一个更大的乌克丽E:它有n根这,每核这上都有(10181)个品位(ires)&#xff…

危险区域闯入识别系统 yolov8

危险区域闯入识别系统通过YOLOv8网络模型技术,危险区域闯入识别系统对现场画面中发现有人违规闯入禁区,系统立即抓拍告警同步回传后台。YOLOv8 提供了一个全新的 SOTA 模型,包括 P5 640 和 P6 1280 分辨率的目标检测网络和基于 YOLACT 的实例…

打电话用的耳机哪个牌子的好?打电话专用的蓝牙耳机推荐

耳机是可以帮助我们进行工作的娱乐设备,像日常中使用最多的就是通话和听歌啦,近几年不论是从产品推出速度,还是做工及品质上来说都有了质的飞跃,下面分享几款打电话音质好的蓝牙耳机。 一、南卡小音舱Lite2蓝牙耳机 蓝牙版本&am…

Inpaint Anything (AI替换)

1、介绍 Inpaint Anything 是一个结合了 SAM、图像修补模型(例如 LaMa)和 AIGC 模型(例如 Stable Diffusion)等视觉基础模型的AI图像替换,修补系统。 基于此系统,用户可以方便的使用IA进行图像替换&#…