设计模式8——原型模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。

原型模式(Prototype)

目录

一、概述

二、优点

三、使用步骤

四、举例(深复制)


一、概述

1、用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象;
2、可以从一个对象再创建另外一个可定制的对象,而且不需要知道任何的细节;
3、不用重新初始化对象,而是动态地获得对象运行时得状态。

1.1、主要的角色就一种:

  • 待克隆的对象:也就是需要频繁被复制的对象,我们采用克隆的思想去复制他。

或许会有疑问,这个模式不就是复制实例对象吗?着我手动代码就复制了,有必要专门讨论吗?和一般一行一行代码复制不一样,这个的理论是希望他能直接在内存里就复制过去,而不是我们再创建一片空间,然后把对象属性一个一个复制过去。就此我们将对比两种方式、如下图

1.2、  一般复制和原型模式的对比:

1.3、通过技术实现的角度看,UML图如下:

二、优点

  • 提高了性能、也减少了重复代码

三、使用步骤

  1. 如果有某个类需要同时创建大量的实例,并且这个类的实例大都相似,那么就可以考虑使用原型模式;
  2. 实现原型模式对于不同语言有不同的方式,但应该提供一个接口,用来克隆对象实例。

四、举例(深复制)

假设张三要写两份简历,简历里有姓名、性别、年龄、以及工作经历,其中工作经历是一个引用对象;因为某些原因,两份简历,其中年龄不一样(一个是25岁,一个是28岁)、工作经历不一样(一个是在度百工作经历,一个是讯腾工作经历),其他的都一样。

4.1、分析步骤:

1、分析上述问题:

  • 我们发现完全填写好一份简历比较麻烦,且此简历都属于同一个人,只是某些项有不同,此时我们可以考虑原型模式;
  • 对于原型模式,实际实现时都是去实现克隆接口,此接口应当可以完成对实例的完整复制;
  • 另外本例有一个引用对象——工作经历,一般情况下复制是简历里变量的值,也就是工作经历引用地址,所以会导致多个简历实例对象里的工作经历变量指向同一个工作经历实例对象,这肯定是有问题的,还需要另外的处理,就是让工作经历类也可以克隆,也即深复制。这样每次克隆或复制简历对象时,也克隆工作经历,让新复制的简历里的工作经历变量也指向新复制的实例。同理,当有多个引用对象时,应当都应用原型模式,使其可以克隆或复制。

2、针对问题的设计要素:

  • 简历类
  • 工作经历类

都要实现克隆或复制。

4.2、uml图如下:

4.3、Java实现代码如下(建议你在本地试一下,加深印象):

(对于Java实现原型模式,需要实现Cloneable接口,然后再写clone方法)

工作经历类:

public class WorkExperience implements Cloneable {private String timeArea; //工作时间public String getTimeArea() {return timeArea;}public void setTimeArea(String timeArea) {this.timeArea = timeArea;}private String company; //工作公司名称public String getCompany() {return company;}public void setCompany(String company) {this.company = company;}public WorkExperience clone() { //实现克隆接口WorkExperience workExperience = null;try {workExperience = (WorkExperience) super.clone();} catch (CloneNotSupportedException e) {System.out.println("Clone异常");}return workExperience;}
}

简历类:

public class Resume implements Cloneable{private String name; //姓名private String sex; //性别private String age; //年龄private WorkExperience workExperience; //工作经历类public Resume(String name) {this.name = name;this.workExperience = new WorkExperience();}public void setPersonalInfo(String sex, String age) {this.sex = sex;this.age = age;}public void setWorkExperience(String timeArea, String company) {this.workExperience.setTimeArea(timeArea);this.workExperience.setCompany(company);}public void display() { //展示简历System.out.println(this.name + " " + this.sex + " " + this.age);System.out.println("工作经历:" + this.workExperience.getTimeArea() + " " + this.workExperience.getCompany());}public Resume clone(){  //实现克隆接口Resume resume = null;try {resume = (Resume) super.clone();resume.workExperience = this.workExperience.clone();  //调用对引用对象工作经历的克隆接口,将新复制的工作经历实例对象复制给本对象的成员变量,从而最终能够实现深复制} catch (CloneNotSupportedException e) {System.out.println("Clone异常");}return resume;}
}

 主程序(发起请求的类):

public class Main {public static void main(String[] args) {//第一份简历Resume resume1 = new Resume("张三");resume1.setPersonalInfo("man", "25");resume1.setWorkExperience("2015-2018", "度百");//第二份简历Resume resume2 = resume1.clone(); //复制第一份简历,然后再第一份简历上做简单修改可以得到第二份简历resume2.setPersonalInfo("man", "28");resume2.setWorkExperience("2018-2021", "讯腾");System.out.println("第一份简历:");resume1.display(); //展示简历1System.out.println("第二份简历:");resume2.display(); //展示简历2}
}

这里就不再举例了,可以把上面的Java例子复制到你本地,运行main函数试一下加深理解。这些代码都是我自己学习的时候根据一些教材手敲的,不存在bug可以直接运行。

如果觉得本文还不错,就请点个赞吧!如果有建议,也请评论指教和讨论!

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

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

相关文章

大模型日报|今日必读的 5 篇大模型论文

大家好,今日必读的大模型论文来啦! 1.Meta 领衔:一文读懂视觉语言建模(VLM) 人们正在尝试将大型语言模型(LLMs)扩展到视觉领域。从可以引导我们穿越陌生环境的视觉助手,到仅使用高…

Linux环境基础开发工具使用

一.Linux第一个小程序-进度条 1.版本一: 1: process.c ? ? 2: process,h ? ?? 3: main.c ? ? ?? buffers 1…

LeetCode题练习与总结:有序链表转换二叉搜索树--109

一、题目描述 给定一个单链表的头节点 head ,其中的元素 按升序排序 ,将其转换为平衡二叉搜索树。 示例 1: 输入: head [-10,-3,0,5,9] 输出: [0,-3,9,-10,null,5] 解释: 一个可能的答案是[0,-3,9,-10,null,5],它表…

OpenHarmony迎来首个互联网技术统一标准,鸿蒙OS生态走向如何?

开源三年半,OpenHarmony(以下简称“开源鸿蒙”)迎来了新进展。在5月25日召开的「OpenHarmony开发者大会」上,鸿蒙官宣了开源鸿蒙设备统一互联技术标准。 一直以来,各行业品牌操作系统相互独立、难以协同,成为其互联互通的痛点。为进一步解决…

3d火灾救援模拟仿真培训软件复用性强

消防VR安全逃生体验系统是深圳VR公司华锐视点引入了前沿的VR虚拟现实、web3d开发和多媒体交互技术,为用户打造了一个逼真的火灾现场应急逃生模拟演练环境。 相比传统的消防逃生模拟演练,消防VR安全逃生体验系统包含知识讲解和模拟实训演练,体…

前端自动将 HTTP 请求升级为 HTTPS 请求

前端将HTTP请求升级为HTTPS请求有两种方式&#xff1a; 一、index.html 中插入meta 直接在首页 index.html 的 head 中加入一条 meta 即可&#xff0c;如下所示&#xff1a; <meta http-equiv"Content-Security-Policy" content"upgrade-insecure-requests&…

Python图像处理库全面详细解析

目录 引言 PIL和Pillow&#xff1a;基础但强大的图像处理 PIL到Pillow的演变 功能亮点 实际应用案例 Pillow的适用场景 结论 ​编辑 OpenCV&#xff1a;计算机视觉的瑞士军刀 OpenCV的核心特点 功能亮点 实际应用案例 OpenCV的适用场景 结论 ​编辑 Scikit-Imag…

Linux echo命令(在终端输出文本)

文章目录 Linux Echo命令深度解析简介命令语法常见选项- -n&#xff1a;不输出行尾的换行符&#xff0c;这意味着输出后不会换到下一行。- -e&#xff1a;启用反斜杠转义的解释&#xff0c;允许使用特殊字符。- -E&#xff1a;禁用反斜杠转义的解释&#xff08;默认选项&#x…

【哈希】闭散列的线性探测和开散列的哈希桶解决哈希冲突(C++两种方法模拟实现哈希表)(1)

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; C进阶 &#x1f389;其它专栏&#xff1a; C初阶 | Linux | 初阶数据结构 小伙伴们大家好&#xff0c;本片文章将会讲解 哈希函数与哈希 之 闭散列的线性探测解决哈希冲突 的相关内容。 如…

【论文阅读】Rank-DETR(NIPS‘23)

paper:https://arxiv.org/abs/2310.08854 code:https://github.com/LeapLabTHU/Rank-DETR

conda 环境找不到 libnsl.so.1

安装prokka后运行报错 perl: error while loading shared libraries: libnsl.so.1: cannot open shared object file: No such file or directory 通过conda list 可以看到 有libsnl 2.00版本&#xff0c;通过修改软链接方式进行欺骗

ssm137基于SSM框架的微博系统+vue

微博系统网站的设计与实现 摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代&#xff0c;所以对于信息的宣传和管理就…

【已解决】C#设置Halcon显示区域Region的颜色

前言 在开发过程中&#xff0c;突然发现我需要显示的筛选区域的颜色是白色的&#xff0c;如下图示&#xff0c;这对我们来说不明显会导致我的二值化筛选的时候存在误差&#xff0c;因此我们需要更换成红色显示这样的话就可以更加的明显&#xff0c;二值化筛选更加的准确。 解…

arcgisPro精确移动要素某一点至指定点位

1、打开要素&#xff0c;如下&#xff1a; 2、选择移动工具&#xff0c;如下&#xff1a; 3、选择需要移动的要素&#xff0c;如下&#xff1a; 4、按住Ctrl键&#xff0c;移动锚点的位置至三角形顶点位置&#xff0c;如下&#xff1a; 5、拖动锚点至上面多边形的左上角点&…

线性稳压电路和开关稳压电路

稳压二极管稳压电路 电网电压增大&#xff0c;导到u1端的电压增大&#xff0c;从而使输出电压&#xff0c;稳压二极管两端的电压增大&#xff0c;稳压二极管两端电压增大&#xff0c;使流过的电注增大。那么&#xff0c;流过线性电阻R的总电流增大。 Ur电压增大&#xff0c;从…

软考结束。有什么要说的

1. 竟然是机试&#xff0c;出乎我意料。是 考试机构觉得笔试成本高了么。这次的考试是机试&#xff0c;相比以往有所不一样。感言是不是以后都会在固定地点考试也说不准。 2. 遇到年轻人。 这次旁边的一个女同学第一次参加&#xff0c;还像我询问了一些关于软考的事。我是有…

安卓开机启动阶段

目录 概述一、boot_progress_start二、boot_progress_preload_start三、boot_progress_preload_end四、boot_progress_system_run五、boot_progress_pms_start六、boot_progress_pms_system_scan_start七、boot_progress_pms_data_scan_start八、boot_progress_pms_scan_end九、…

家用洗地机哪个品牌好?家用洗地机排行榜前十名

随着洗地机逐渐进入大众视野&#xff0c;这种集吸、拖、洗功能于一体的清洁工具&#xff0c;凭借其高效便捷的特点&#xff0c;成为家庭清洁的新宠。洗地机不仅能够减少地面清洁时间&#xff0c;节省体力&#xff0c;还能提高清洁效果。然而&#xff0c;面对琳琅满目的洗地机品…

YOLOv10详细解读 | 一文带你深入了解yolov10的创新点(附网络结构图 + 举例说明)

前言 Hello大家好&#xff0c;我是Snu77&#xff0c;继YOLOv9发布时间没有多久&#xff0c;YOLOv10就紧接着发布于2024.5.23号&#xff08;不得不感叹YOLO系列的发展速度&#xff0c;但要纠正大家的观点就是不是最新的就一定最好&#xff09;&#xff01; 本文给大家带来的是…

体验SmartEDA的高效与便捷,电子设计从未如此简单

SmartEDA&#xff1a;革新电子设计&#xff0c;让高效与便捷触手可及 在快节奏的现代生活中&#xff0c;科技日新月异&#xff0c;各行各业都在寻求更高效、更便捷的解决方案。对于电子设计行业而言&#xff0c;SmartEDA的出现&#xff0c;无疑是一场革命性的变革。它以其高效…