设计模式-创建型模式-原型模式
1.原型模式定义
用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象;
1.1 原型模式优缺点
优点
- 当创建一个新的对象实例较为复杂时,使用原型模式可以简化对象的创建过程,通过复制一个已有的实例可以提高新实例的创建效率;
- 相较比工程模式,原型模式提供了简化的创建结构,无需专门的工厂类来创建产品;
- 可以使用深克隆的方式保存对象状态,辅助实现撤销操作;
缺点
- 需要为每个类配备一个克隆方法,而且这个克隆方法位于一个类的内部,对已有的类改造时需要修改源代码,违反了开闭原则;
1.2 原型模式适用场景
创建对象的成本比较大,比如对象中的数据是经过复杂计算或者需要从数据库得到,这种情况就可以使用原型模式,从其他已有的对象中进行拷贝,而不是每次都创建新的对象;
- 资源优化场景,如当进行对象初始化需要很多外部资源,IO资源、数据文件、CPU、网络、内存等;
- 复杂的依赖场景,如A对象的创建依赖B,B依赖C,C依赖D。。。
- 性能和安全要求的场景,如同一个用户在一个会话周期里,可能会反复登录平台或使用某些受限的功能,每一次访问请求都会访问授权服务器进行授权,但如果每次都通过 new 产生一个对象会非常烦琐,这时则可以使用原型模式;
- 同一个对象可能被多个修改者使用的场景;
- 需要保存原始状态的场景,如记录历史操作的场景;
2.原型模式原理
原型模式核心就是通过克隆复制一个对象;
- 抽象原型类(Prototype):声明克隆方法的接口类,是所有具体原型类的公共父类,它可以是抽象类也可以是接口;
- 具体原型类(ConcretePrototype):实现在抽象原型类中声明的克隆方法,在克隆方法中返回自己的一个克隆对象;
- 客户类(Client):在客户类中使一个原型对象克隆自身从而创建一个新的对象,由于客户类针对抽象原型类编程,因此用户可以根据需要选择具体原型类,系统具有较好的扩展性,增加或者替换原型类都比较方便;
2.1 深克隆与浅克隆
- 深克隆:完全创建一个新对象,且新对象的变量同原型一致,二者互不影响;
- 浅克隆:新对象的变量同原型一致,且新对象的引用仍然指向原型对象,二者共享同一对象;
Java 中的 Object 类的 clone() 方法就是浅克隆;如下面常用的BeanUtils用到了浅克隆;
BeanUtils.cloneBean(Object obj);
对象序列化之后再进行反序列化获取到的就是不同对象,这就是深克隆;
SerializationUtils.clone(T object);
3.原型模式实现
【实例】
如一个广告邮件的发送,大部分信息都是用的模板是相同的,只有收件人等不同,如果每发送一个邮件就创建一个邮件对象比较浪费,这就可以用到原型模式;
【代码】
首先实体类中重写clone()方法
@Data
public class Mail implements Cloneable{//收件人private String receiver;//邮件名称private String subject;//称谓private String appellation;//邮件内容private String context;//构造函数public Mail(AdvTemplate advTemplate) {this.context = advTemplate.getAdvContext();this.subject = advTemplate.getAdvSubject();}@Overridepublic Mail clone(){Mail mail = null;try {mail = (Mail)super.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();}return mail;}
}
然后即可克隆该对象
//模拟邮件发送
int i = 0;//把模板定义出来,数据是从数据库获取的
Mail mail = new Mail(new AdvTemplate());
mail.setTail("xxx银行版权所有");
while(i < MAX_COUNT){//下面是每封邮件不同的地方Mail cloneMail = mail.clone();cloneMail.setAppellation(" 先生 (女士)");Random random = new Random();int num = random.nextInt(9999999);cloneMail.setReceiver(num+"@"+"liuliuqiu.com");//发送 邮件sendMail(cloneMail);i++;
}
相关文章:
![](https://i-blog.csdnimg.cn/direct/5bdef1dcd40f43a1806d8e4c87ec7947.png)
设计模式-创建型模式-原型模式
1.原型模式定义 用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象; 1.1 原型模式优缺点 优点 当创建一个新的对象实例较为复杂时,使用原型模式可以简化对象的创建过程,通过复制一个已有的实例…...
![](https://i-blog.csdnimg.cn/direct/78afbaed18124cdfa866558009b0a46a.png#pic_center)
遗传算法与深度学习实战(7)——使用遗传算法解决N皇后问题
遗传算法与深度学习实战(7)——使用遗传算法解决N皇后问题 0. 前言1. N 皇后问题2. 解的表示3. 遗传算法解决 N 皇后问题小结系列链接 0. 前言 进化算法 (Evolutionary Algorithm, EA) 和遗传算法 (Genetic Algorithms, GA) 已成功解决了许多复杂的设计…...
![](https://i-blog.csdnimg.cn/direct/e3c5309675614fbf9c317630ba51b823.png)
R语言:如何安装包“linkET”
自己在R语言中安装包“linkET”时报错不存在叫‘linket’这个名字的程辑包 尝试了install.packages("linkET")和BiocManager::install("linkET")两种安装办法都不行 >install.packages("linkET") WARNING: Rtools is required to build R pa…...
![](https://i-blog.csdnimg.cn/direct/46a032f16c654b10871593f5f7152989.png)
JSON, YAML, XML, CSV交互可视化
1、jsoncrack https://jsoncrack.com/editor...
![](https://www.ngui.cc/images/no-images.jpg)
Android UI:PopupWindow:源码分析:设置WindowManager.LayoutParams中的各种参数
文章目录 设置flags是否包含某些flag设置gravity设置type设置softInputMode设置windowAnimations设置width/height设置token 在WindowManager.addView之前设置在WindowManager.addView之后,可通过i熬夜难过update方法设置设置format设置flags是否包含某些flag 1666 …...
![](https://www.ngui.cc/images/no-images.jpg)
MySQL:从入门到放弃
基础查询 MySQL:基础查询 Mybatis:基础巩固-DDL 项目实战 MySQL:按照日期分组查询 查询开始时间与结束时间在指定的日期范围之内,并且结束时间可以为NULL的数据...
![](https://i-blog.csdnimg.cn/direct/3819bd3681484d76bd5725c1ac194fa5.png)
C++OpenGL三维显示镜面反射光线漫反射实例
程序示例精选 COpenGL三维显示镜面反射光线漫反射实例 如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助! 前言 这篇博客针对《COpenGL三维显示镜面反射光线漫反射实例》编写代码,代码整洁,…...
![](https://www.ngui.cc/images/no-images.jpg)
【前端面试】从npm 升级到 pnpm的总结
pnpm优势 pnpm 和 npm 在性能上存在一些明显的差异,这也是一些开发者选择从 npm 切换到 pnpm 的原因。以下是一些关键的差异和原因: 1. 速度: pnpm 比 npm 快了近 2 倍,它通过优化的依赖管理,显著提高了安装速度 。 2. 磁盘空间效率: pnpm 使用基于内容寻址的文件系…...
![](https://www.ngui.cc/images/no-images.jpg)
同步外网YUM源-3
在企业实际应用场景中,仅仅靠光盘里面的RPM软件包是不能满足需要,我们可以把外网的YUM源中的所有软件包同步至本地,可以完善本地YUM源的软件包数量及完整性。 获取外网YUM源软件常见方法包括Rsync、Wget、Reposync,三种同步方法的区别Rsync方式需要外网YUM源支持RSYNC协议…...
![](https://i-blog.csdnimg.cn/direct/ed9b928019ca4146a33d73c7e7d3fb30.png)
Linux的oracle数据库导入其他用户导出的数据库文件
如果用户使用的是expdp的命令,导入就要使用impdp命令,本文以impdp为例进行介绍 1、查看当前创建的所有dmp导出目录 select * from dba_directories 2、为创建的目录赋权限 比如咱们将数据库导入到test用户, grant read,write on directo…...
![](https://img-blog.csdnimg.cn/img_convert/843c1942c793072dc1be3997f082e6e4.png)
FLUX.1 文生图模型微调指南
FLUX.1 是 Black Forest Labs 今年夏天发布的文本转图像模型系列。FLUX.1 模型为开源图像生成模型树立了新标准:它们可以生成逼真的手、清晰的文本,甚至可以生成搞笑表情包这样异常困难的任务。 现在,你可以使用 Ostris 的 Replicate 上的 A…...
![](https://www.ngui.cc/images/no-images.jpg)
JavaWeb基础:HTTP协议与Tomcat服务器
目录 1. HTTP协议简介 示例代码:创建HTTP GET请求 2. Tomcat服务器介绍 Tomcat的基本操作 示例代码:部署简单Servlet 3. 使用Servlet处理请求 示例代码:处理POST请求 在现代网络开发中,理解HTTP协议和如何使用Tomcat作为服…...
![](https://i-blog.csdnimg.cn/direct/811edff1994d49baa5462efd4e462c2a.png)
python井字棋游戏设计与实现
python实现井字棋游戏 游戏规则,有三个井字棋盘,看谁连成的直线棋盘多谁就获胜 棋盘的展现形式为 棋盘号ABC和位置数字1-9 输入A1 代表在A棋盘1号位数下棋 效果图如下 部分源码如下: 卫星工纵浩 白龙码程序设计,点 代码获取 …...
![](https://img-blog.csdnimg.cn/img_convert/94e1e3b9b564f596c8208c7272935d3f.png)
据说是可以和 Windows 一拼的 5个 Linux 发行版
现如今有数以千计的 Linux 发行版可供您使用,然而人们却无法选择一个完美的操作系统来替代 Windows。 使用 Windows 时,傻瓜都能操作自如,同样的方法却不适用于 Linux。在这里,您必须具备操作和使用操作系统的基本知识。因此人们经…...
![](https://www.ngui.cc/images/no-images.jpg)
PHP 常用函数
1. ksort() 如果你有一个数组 array([11] > array(XX), [6] > array(YYY)),你想要返回按照key重新排序,并不改变键和值之间的关联,处理之后的结果为 array([6] > array(YY…...
![](https://img-blog.csdnimg.cn/img_convert/9630604e6cab8c96c15d8a527c5751f8.png)
如何将MySQL迁移到TiDB,完成无缝业务切换?
当 MySQL 数据库的单表数据量达到了亿级,会发生什么? 这个现象表示公司的业务上了一个台阶,随着数据量的增加,公司规模也进一步扩大了,是非常喜人的一个改变 ,然而随之而来的其他变化,就没那么…...
![](https://i-blog.csdnimg.cn/direct/55d908cbb30a42c19e267fbaa456514e.png)
【嵌入式烧录刷写文件】-2.10-为一个Intel Hex文件计算校验和Checksum
案例背景(共6页精讲): 有如下一段Intel Hex文件,为其创建Checksum校验和:CRC16,CRC32(CVN),SHA-256 Hash算法…, 将Checksum Value填充到指定地址。 :2091000058595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767…...
![](https://i-blog.csdnimg.cn/direct/d4de07551f8f4313b9403193cfbc4e3a.png)
整体思想以及取模
前言:一开始由于失误,误以为分数相加取模不能,但是其实是可以取模的 这个题目如果按照一般方法,到达每个节点再进行概率统计,但是不知道为什么只过了百分之十五的测试集 题目地址 附上没过关的代码 #include<bits…...
![](https://i-blog.csdnimg.cn/direct/8168921e39044c99aa8f07eed54f20f2.png)
RabbitMQ 消息可靠保障
RabbitMQ 消息可靠保障 消息的可靠性保证生产者重连生产者确认解决思路A-确认机制解决思路B-备份交换机 MQ 服务器宕机导致消息丢失消费端消息的可靠性保障 消费端限流给消息生成唯一id 消息的可靠性保证 实际项目中 MQ 的流程一般是:生产端把消息路由到交换机&…...
![](https://www.ngui.cc/images/no-images.jpg)
Redis 作为 PHP 的会话存储
使用 Redis 作为 PHP 的会话存储,可以实现多个服务器之间的会话共享,提高会话管理的效率,特别是在分布式系统中。这种方法将会话数据存储在 Redis 中,而不是使用默认的文件系统,从而使多个服务器可以访问相同的会话数据…...
![](https://img-blog.csdnimg.cn/img_convert/1c48ec3e052f2b548022c73e67c239ef.jpeg)
基于伏图的数字心脏模拟仿真APP应用介绍
一、背景介绍 心脏是保证人体正常运转最重要的动力,人体内的血液循环通过心血管运输到各个部位,因此,心血管系统的稳定是人体健康的关键。心血管内科领域极具专业性,其理论研究与技术发展日新月异,心血管疾病患者往往…...
![](https://i-blog.csdnimg.cn/direct/fd826eef84a44ed298ff6867f4ffc1df.png)
智云-一个抓取web流量的轻量级蜜罐docker一键启动
智云-一个抓取web流量的轻量级蜜罐docker安装教程 github地址 https://github.com/xiaoxiaoranxxx/POT-ZHIYUN docker快速启动(v1.4) git clone https://github.com/xiaoxiaoranxxx/POT-ZHIYUN.git cd POT-ZHIYUN docker-compose up -d默认映射到80和8080端口 mysql不对外开放…...
![](https://i-blog.csdnimg.cn/direct/b2be2fc44e8e4478845a0536e2487510.png)
原生HTML5、CSS、JavaScript实现简易网易云音乐播放
1.效果图 2.源码 1.index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>网易云音乐</title><link rel"stylesheet" href"../CSS/index.css"> </head>…...
![](https://img-blog.csdnimg.cn/b5ec7b667bf34a8fa717d503b1f2cff5.png)
网上商城小程序的设计
管理员账户功能包括:系统首页,个人中心,用户管理,商品信息管理,商品类型管理,活动专区管理,新品上架管理,用户评价管理,订单管理,系统管理 微信端账号功能包…...
![](https://i-blog.csdnimg.cn/direct/b349cc12e04c45d1835f9662e816cc27.png#pic_center)
微分方程(Blanchard Differential Equations 4th)中文版Section2.2
动力系统的几何分析 捕食者-猎物系统的向量场 在第2.1节中,我们展示了两个不同捕食者-猎物系统的 R ( t ) R(t) R(t) 和 F ( t ) F(t) F(t) 图形,但没有描述我们是如何生成这些图形的。我们将在第2.5节中解决这个问题,采用欧拉方法推广到…...
![](https://www.ngui.cc/images/no-images.jpg)
Swift 环境搭建
Swift 环境搭建 Swift 是由苹果公司开发的一种强类型编程语言,用于iOS、macOS、watchOS和tvOS应用程序的开发。搭建Swift开发环境是开始使用Swift进行编程的第一步。本文将详细介绍如何在不同的操作系统上搭建Swift开发环境。 在macOS上搭建Swift环境 系统要求 …...
![](https://www.ngui.cc/images/no-images.jpg)
科技与出版
科技与出版 ISSN: 1005-0590 CN: 11-3209/G3 常设栏目:特别策划、产业观察、融媒之光、编辑实务、营销方略、学术探索、创作空间等。 稿件要求 (1)来稿应有创新性;立论科学,主题明确,推理严谨;词语准确,…...
![](https://www.ngui.cc/images/no-images.jpg)
5年前端面试之路
作者:星空海绵 顺便吆喝一声,技术大厂,内推捞人,前/后端or测试←感兴趣 --加班偶尔较多,但周末加班两倍工资。 --15-35K,工资一线城市属于一般,但二线城市很可以。 前言 由于公司要进行…...
![](https://i-blog.csdnimg.cn/direct/0cf938914bc44de3b9b4d24c7454f672.png)
产品运营(一)--产品运营是什么?
1.运营是什么? 通过一系列穿针引线式的行为和资源投入,让一件事能持续良性运转。 运营面向的主体不同,使用的运营手段也是不同的。作用:赋予产品闪耀的光芒。距离用户最近的人(体验用户,成为用户?demo:k…...
![](https://i-blog.csdnimg.cn/direct/edbfda5b38414b818ee32ae9fee35ca0.png)
学习大数据DAY41 Hive 分区表创建
目录 分区表 分区表应用场景 oracle 分区表种类 oracle 分区-范围分区 oracle 分区-列表分区 oracle 分区-散列分区 oracle 分区-组合分区 oracle 分区-分区表操作 hive 分区-创建分区表 hive 分区-分区表操作 hive 分区-动态分区表配置 上机练习 分区表 分区是将一…...
![](https://img-blog.csdnimg.cn/img_convert/5268f80b9b1e01f982625ef6fac83ca1.png)
做装修的网站怎么做好/杭州百度推广电话
这次给大家带来vue项目中如何使用ueditor,vue项目中使用ueditor的注意事项有哪些,下面就是实战案例,一起来看一下。以vue-cli生成的项目为例1.static文件夹下先放入ueditor文件2.index.html添加如下代码3.webpack.base.conf.js添加如下配置ex…...
![](/images/no-images.jpg)
动态网站的功能与特点/怎样做网站的优化、排名
East Central North America 2005-2006——Two Ends 题目来源: POJ 2738Codeforces Gym 100650H题意: 有一组数,你和一个人轮流取数(只能从两端取),问你能取到的最大的数和同时对方取到的数的差值。 题解&a…...
![](http://b2b.toocle.com/Public/Upload/image/20180710/1531183738428062.png)
wordpress自动翻译插件/西安seo站内优化
新淘宝短视频就要计入手淘主搜,淘宝一直在变化,但是不变的是内容影响,做好内容,才能拥有明天的流量。做店铺,需要新方法,需要持续的去操作。 微淘作为卖家引流,以及提升粉丝活跃度粘性的工具&a…...
![](/images/no-images.jpg)
新淘客wordpress插件/刷推广软件
如果同时使用这两个插件的话,json_serializable没有办法使用,这是flutter的bug。相关链接如下: https://github.com/dart-lang/build/issues/2835 暂时的解决方式是在.dart_tool/flutter_gen下面添加pubspec.yaml.。内容如下: dependencies:...
![](/images/no-images.jpg)
江苏建设教育/电脑系统优化软件
我会持续分享一些我发现的好网站,帮助大家提高技术。谢谢。 1.发现一个很好的网站,可以下载一些文档,对于英语差的同学来说是一个福利。 网址:http://www.open-open.com/doc/ 网站名:OPEN开源文档。 2. 推荐一个python…...
![](/images/no-images.jpg)
做网站图片路径做缓存吗/今日热点新闻视频
上海最近搞活动调休,要搞深度学习,win上还是不方便,准备弄个ubuntu。于是有以下回忆文字。在机器上装了个双系统。花了两天。再也不想玩了。准备用ubuntu来做深度学习的。本文写于2019年11月4日。机器是神舟Z7-KP7D2,i7-7700HQGTX…...