23种设计模式(3)-原型模式
定义:
通过复制现有的对象实例来创建新的对象实例。
实现:
实现Cloneable接口:
Cloneable接口的作用是在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone方法。在java虚拟机中,只有实现了这个接口的类才可以被拷贝,否则在运行时会抛出CloneNotSupportedException异常。
重写Object类中的clone方法:
Java中,所有类的父类都是Object类,Object类中有一个clone方法,作用是返回对象的一个拷贝,但是其作用域protected类型的,一般的类无法调用,因此,原型类需要将clone方法的作用域修改为public类型。
示例:
例如,对于拿邮件发邀请函,邮件类大部分内容都是一样的:邀请原由、相邀地点,相聚时间等等,但对于被邀请者的名称和发送的邮件地址是不同的。
定义Mail类:
public class Mail implements Cloneable {
private String receiver;
private String subject;
private String content; private String tail;
public Mail(EventTemplate et) {
this.tail = et.geteventContent(); this.subject = et.geteventSubject();} @Overridepublic Mail clone() {Mail mail = null; try {mail = (Mail) super.clone(); } catch (CloneNotSupportedException e) { // TODO Auto-generated catch blocke.printStackTrace();} return mail;}
//get、set.....
}
测试方法:
public static void main(String[] args) {int i = 0;int MAX_COUNT = 10;EventTemplate et = new EventTemplate("邀请函(不变)", "婚嫁生日啥的....(不变部分)");Mail mail = new Mail(et); while (i < MAX_COUNT) {Mail cloneMail = mail.clone();cloneMail.setContent("XXX先生(女士)(变化部分)"+ mail.getTail());cloneMail.setReceiver("每个人的邮箱地址...com(变化部分)");sendMail(cloneMail);i++;}}
优点:
1,使用原型模型创建一个对象比直接new一个对象更有效率,因为它直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显。
2,隐藏了制造新实例的复杂性,使得创建对象就像我们在编辑文档时的复制粘贴一样简单。
缺点:
1,由于使用原型模式复制对象时不会调用类的构造方法,所以原型模式无法和单例模式组合使用,因为原型类需要将clone方法的作用域修改为public类型,那么单例模式的条件就无法满足了。
2,使用原型模式时不能有final对象。
3,Object类的clone方法只会拷贝对象中的基本数据类型,对于数组,引用对象等只能另行拷贝。这里涉及到深拷贝和浅拷贝的概念。
深拷贝与浅拷贝:
浅拷贝:
将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的(这样不安全)。
深拷贝:
将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。
那么深拷贝如何具体实现呢?
继续上面的例子,增加了一个ArrayList属性。
private String receiver;
private String subject;
private String content;
private String tail;
private ArrayList<String> ars;
此时,单mail = (Mail) super.clone();无法将ars指向的地址区域改变,必须另行拷贝:
try {mail = (Mail) super.clone(); mail.ars = (ArrayList<String>)this.ars.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();
}
适用场景:
1,复制对象的结构和数据。
2,希望对目标对象的修改不影响既有的原型对象。
3,创建一个对象的成本比较大。
23种设计模式(3)-原型模式相关推荐
- 在王者荣耀角度下分析面向对象程序设计B中23种设计模式之原型模式
· 原型模式在王者荣耀中的应用 · 一.简述 在王者荣耀中,克隆模式算是一个人气比较高的娱乐模式了,因为该模式下双方可以各有五个一模一样的英雄,可以带给玩家不同的游戏体验,特别是有一些比较好玩的英雄, ...
- 23天读懂23种设计模式:原型模式(创建型)
点击上方 蓝字 关注我们 创建型模式是用来创建对象的模式,抽象了实例化的过程,帮助一个系统独立于其他关联对象的创建.组合和表示方式. 原型模式目的:用原型实例指定创建对象的种类,并且通过拷贝这些原型创 ...
- 23种设计模式之原型模式代码实例
原型模式就是利用一个克隆"原型"来产生新对象的一种模式, 克隆又分浅克隆与深克隆, 浅克隆:将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的. ...
- 23种设计模式之原型模式
原型模式的定义 定义: 用原型实例指定创建对象的种类, 并且通过拷贝这些原型创建新的对象. 通俗的讲,就是不再使用new 来创建对象, 而改用 clone 方法来得到新的对象 原型模式的核心是一个 c ...
- 《23种设计模式之原型模式(2种实现)》
说在前头:本人为大二在读学生,书写文章的目的是为了对自己掌握的知识和技术进行一定的记录,同时乐于与大家一起分享,因本人资历尚浅,能力有限,文章难免存在一些错漏之处,还请阅读此文章的大牛们见谅与斧正.若 ...
- 二十三种设计模式之原型模式
今天继续探讨GOF二十三种设计模式的原型模式,原型模式也是属于创建型模式的一种 原型模式通俗的讲就是对象复制的过程,即通过一个原型对象,我可以得到一个该对象的克隆. 下面来看下原型模式的第一种写法-- ...
- 23种设计模式——装饰者模式
文章目录 23种设计模式--装饰者模式 1.装饰者模式概述 2.装饰者模式的结构 3.装饰者模式的实现 4.装饰者模式的应用场景 23种设计模式--装饰者模式 1.装饰者模式概述 背景 有些人为了早上 ...
- 实践GoF的23种设计模式:建造者模式
本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:建造者模式>,作者: 元闰子. 简述 在程序设计中,我们会经常遇到一些复杂的对象,其中有很多成员属性,甚至嵌套着多个复杂的对象 ...
- 【Go实现】实践GoF的23种设计模式:命令模式
上一篇:[Go实现]实践GoF的23种设计模式:代理模式 简单的分布式应用系统(示例代码工程):https://github.com/ruanrunxue/Practice-Design-Patter ...
- 23种设计模式7_代理模式之一静态代理
23种设计模式7_代理模式之一静态代理 1 基本介绍 代理模式:为其他对象提供一种代理以控制对这个对象的访问 代理模式也叫委托模式,它是一项基本设计技巧.许多其他的模式,如状态模式.策略模式.访问者模 ...
最新文章
- Python过渡性模块重载(递归重载模块)
- 浅析:精密空调能耗超高的原因!
- HDU 2055 An easy problem
- boost::safe_numerics模块实现混合类型产生令人惊讶的结果的测试程序
- 柑橘有了新农具:湖南30县农业主管与顶级专家共商“AIoT种柑橘”
- 2021牛客暑期多校训练营7 K-xay loves sequence(主席树+二分)
- Http(s)与后台交互方式
- 【SCOI2005】【BZOJ1087】互不侵犯King(状压dp)
- 电脑编程python和c加加语言的区别_小猿圈之Bash 和 Python 编程语言优缺点
- YOLO V1,V2, V3的记录
- fiddler拦截response
- scala中父类的继承
- 游戏动词和宾语设计案例精选
- pytorch BiLSTM+CRF模型实现NER任务
- CodeSmith模板代码生成实战详解
- SNN系列|神经元模型篇(4) LIF
- 利用小程序快速生成App,只需七步
- 自助装机配置专家点评2
- [书单]创意写作书 48本
- linux下dns测试命令
热门文章
- 快手小剧场推出独立APP“追鸭”
- 618哪家空调最受欢迎?格力奥克斯互撕 友商却笑到最后
- 拼多多:扶贫项目正连续遭受网络舆情涉黑团伙攻击
- 美图手机官方正式告别:年中关闭手机业务 手机品牌授权给小米
- 苹果为提振销量疯狂试探!官网推出新福利:买买买更轻松
- as模拟器文件夹路径,Android Studio 配置模拟器AVD存放路径(默认在c盘,解决c盘空间不够问题)...
- flutter ios上踩的一个坑
- 网络安全之tcp阻截引擎 (一)
- 一个x86平台的spi flash驱动移植笔记
- 95-36-200-ChannelHandler-系统Channel-LoggingHandler