04.设计模式-原型模式
原型模式属于创建型模式,用原型的实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。调用者不需要关注具体的复制过程,而且不需要知道任何创建的细节,通俗来讲,就是使用一个对象复制一个一模一样的对象出来,目的就是保护最原始的那一份存档。
为什么要保护最原始的那一份存档?以工业生产为例,这里的最原始的那一份存档就相当于工厂中某一商品的模具,其他的所有商品都是由这个模具为雏形,所以,这个模具是不能轻易改变,如果生产了一个商品后,这个商品把模具改变了,那么其后边被生产的产品就不再满足设计要求了。这一特点也决定了原型模式的一个应用场景。
那么原型模式通常应用在哪些方面?
1.从时间成本来说和性能消耗方面来说,假设一个需求中需要创建大量相同的对象,而对象的创建又很耗费时间资源或者空间资源,又不依赖于类的构造方法的时候(clone不会执行构造方法),可以使用原型模式
2.同一个对象,如果存在大量的潜在修改者,每个修改者是基于这个对象最初的状态作修改,相互之间没有影响,可以使用原型模式,例如:我要群发一条邮件,邮件内容,主题,发送时间,等等都是相同的,唯一不同的只有收件人,那么,就可以在这个邮件模版的原型上,通过只修改收件人的值来进行发送即可
public interface Prototype {Prototype cloneMessage();
}
public interface IMessage extends Prototype{String content();String sender();String receiver();String image();String voice();}
public class ImageMessage implements Cloneable,IMessage{public String sender;public String content;public String receiver;public String voice;public String image;@Overridepublic String content() {return content;}@Overridepublic String sender() {return sender;}@Overridepublic String receiver() {return receiver;}public void setContent(String content){this.content = content;}public void setReceiver(String receiver){this.receiver = receiver;}public void setSender(String sender){this.sender = sender;}public void setImage(String image){this.image = image;}public String image() {return image;}@Overridepublic Prototype cloneMessage() {ImageMessage message = new ImageMessage();message.content = this.content;message.image = this.image;message.receiver = this.receiver;message.sender = this.sender;message.voice = this.voice;return message;}@Overridepublic String voice() {// TODO Auto-generated method stubreturn null;}
}
public class VoiceMessage implements IMessage{public String sender;public String content;public String receiver;public String voice;private String image;@Overridepublic String content() {return content;}@Overridepublic String sender() {return sender;}@Overridepublic String receiver() {return receiver;}public void setContent(String content){this.content = content;}public void setReceiver(String receiver){this.receiver = receiver;}public void setSender(String sender){this.sender = sender;}public void setVoice(String voice){this.voice = voice;}public String voice(){return voice;}@Overridepublic Prototype cloneMessage() {VoiceMessage message = new VoiceMessage();message.content = this.content;message.voice = this.voice;message.receiver = this.receiver;message.sender = this.sender;message.image = this.image;return message;}@Overridepublic String image() {return image;}}
public class Client {public static void main(String[] args) {VoiceMessage m = new VoiceMessage();m.setContent("语音消息");m.setSender("张三");m.setReceiver("李四");m.setVoice("语音");// ImageMessage m = new ImageMessage();
// m.setContent("图片消息");
// m.setSender("张三");
// m.setReceiver("李四");
// m.setImage("图片");MessageEngine.sendMessage(m);}}
public class MessageEngine {public static void sendMessage(IMessage message){ IMessage m = (IMessage) message.cloneMessage(); System.out.println("发送消息----消息内容:"+m.content()+"---消息发送人:"+m.sender()+"---消息接受人:"+m.receiver()+"---图片:"+m.image()+"---语音:"+m.voice());}
}
04.设计模式-原型模式相关推荐
- 设计模式 原型模式_创新设计模式:原型模式
设计模式 原型模式 原型模式用于创建对象的副本. 这种模式非常有用,特别是当从头开始创建对象的成本很高时. 与builder , factory和abstract factory模式相比,它不会从头开 ...
- 设计模式 原型模式_设计模式:原型
设计模式 原型模式 创新设计模式之一是原型设计模式 . 尽管原型是创造模式,但它在概念上与其他模式有所区别. 我的意思是原型在某种意义上创造了自己. 我将在下面解释. 原型模式的所有魔力都基于Java ...
- 设计模式 原型模式_原型设计模式:创建另一个小车
设计模式 原型模式 创建对象确实是一个耗时的过程,也是一件昂贵的事情. 因此,我们现在正冒险节省时间和金钱. 我们该怎么做? 克隆奇迹多莉 有人记得多莉吗? 是的,是绵羊,是第一个被克隆的哺乳动物. ...
- Java常用设计模式————原型模式(一)
介绍 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. 原型模式用于创建重复的对象,同时又能保证性能.当直接创建对象的代价比较大时,则采用 ...
- 第六章 Caché 设计模式 原型模式
文章目录 第六章 Caché 设计模式 原型模式 定义 使用场景 优点 结构图 描述 示例 初级写法 缺点 中级写法 缺点 高级写法 (浅复制) 浅复制 深复制 完整示例 简历类(复制类) 对象类(工 ...
- C++设计模式——原型模式(Prototype Pattern)
C++设计模式--原型模式(Prototype Pattern) 微信公众号:幼儿园的学霸 目录 文章目录 C++设计模式--原型模式(Prototype Pattern) 目录 定义 代码示例 普通 ...
- 设计模式---原型模式(Prototype Pattern)
在编程中有时候我们会发现,当我们需要一个实例,可是这个实例的创建过程十分复杂,在执行过程中 会消耗大量的时间,同时创建第一个实例和创建第二个时间的初始化信息并未改变.在此种情况下,直接New 一个实例 ...
- 精通python设计模式-浅谈Python设计模式 - 原型模式
声明,本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 在<精通Python设计模式>中把设计模式分为三种类型: 创建型模式 ...
- [设计模式]原型模式
简介 原型模式 (Prototype)用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 原型模式是一种对象创建型模式 (可参考 设计模式 创建型模式). 结构 图-原型模式结构图 Pr ...
最新文章
- 闲来无事,总结 Xcode常用快捷键
- VS中 无法创建虚拟目录 本地IIS IIS Express 外部主机
- darknet: ./src/cuda.c:36: check_error: Assertion `0' failed.
- 如何注册域名-买服务器-备案-建设网站
- android 手机号码去重,第135天:移动端开发经验总结
- sqlplus中批量执行sql脚本(Oracle)
- centos有趣软件包_这5个软件包使学习R变得有趣
- java utf-8 gbk_Java 字符转码之UTF-8转为GBK/GB2312
- 如何让Mosquitto动态加载配置文件
- vscode的IntelliCode扩展报错
- 【HDU 6020】 MG loves apple (乱搞?)
- java基础——java学习心得
- Spring常用注解
- 孙玄/陈东:聊一聊ZooKeeper的顺序一致性
- 投屏电视显示服务器拒绝,投屏投不上去怎么办?投屏方法汇总,总有一种适合你!...
- 坐标系之间的旋转平移变换与对应变换矩阵的关系
- 翻译小窍门-谢谢你勾引我老公
- 排序刷默认值sql脚本
- 【TeXstudio】【7】段落,编号与自定义编号——《LaTeX入门》
- 02 解方程专题 (各学科:高数、线代、专业课)
热门文章
- 第二周项目2-就拿胖子说事
- Android之了解ThreadLocal
- vs2017编写python_VS2017+VC-LTL编译Python-3.6.4源代码
- [转] 利用CORS实现跨域请求
- php循环语句for while do while的用法
- csdn新版博客初体验
- mysql修改最后一条记录删除第一条记录
- No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer解决方法
- Ace-editor 输入内容时光标闪动,定位错乱的解决方案
- ios系统web(微信公众号)开发遇到的问题及解决方案