原型模式属于创建型模式,用原型的实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。调用者不需要关注具体的复制过程,而且不需要知道任何创建的细节,通俗来讲,就是使用一个对象复制一个一模一样的对象出来,目的就是保护最原始的那一份存档。

为什么要保护最原始的那一份存档?以工业生产为例,这里的最原始的那一份存档就相当于工厂中某一商品的模具,其他的所有商品都是由这个模具为雏形,所以,这个模具是不能轻易改变,如果生产了一个商品后,这个商品把模具改变了,那么其后边被生产的产品就不再满足设计要求了。这一特点也决定了原型模式的一个应用场景。

那么原型模式通常应用在哪些方面?

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.设计模式-原型模式相关推荐

  1. 设计模式 原型模式_创新设计模式:原型模式

    设计模式 原型模式 原型模式用于创建对象的副本. 这种模式非常有用,特别是当从头开始创建对象的成本很高时. 与builder , factory和abstract factory模式相比,它不会从头开 ...

  2. 设计模式 原型模式_设计模式:原型

    设计模式 原型模式 创新设计模式之一是原型设计模式 . 尽管原型是创造模式,但它在概念上与其他模式有所区别. 我的意思是原型在某种意义上创造了自己. 我将在下面解释. 原型模式的所有魔力都基于Java ...

  3. 设计模式 原型模式_原型设计模式:创建另一个小车

    设计模式 原型模式 创建对象确实是一个耗时的过程,也是一件昂贵的事情. 因此,我们现在正冒险节省时间和金钱. 我们该怎么做? 克隆奇迹多莉 有人记得多莉吗? 是的,是绵羊,是第一个被克隆的哺乳动物. ...

  4. Java常用设计模式————原型模式(一)

    介绍 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. 原型模式用于创建重复的对象,同时又能保证性能.当直接创建对象的代价比较大时,则采用 ...

  5. 第六章 Caché 设计模式 原型模式

    文章目录 第六章 Caché 设计模式 原型模式 定义 使用场景 优点 结构图 描述 示例 初级写法 缺点 中级写法 缺点 高级写法 (浅复制) 浅复制 深复制 完整示例 简历类(复制类) 对象类(工 ...

  6. C++设计模式——原型模式(Prototype Pattern)

    C++设计模式--原型模式(Prototype Pattern) 微信公众号:幼儿园的学霸 目录 文章目录 C++设计模式--原型模式(Prototype Pattern) 目录 定义 代码示例 普通 ...

  7. 设计模式---原型模式(Prototype Pattern)

    在编程中有时候我们会发现,当我们需要一个实例,可是这个实例的创建过程十分复杂,在执行过程中 会消耗大量的时间,同时创建第一个实例和创建第二个时间的初始化信息并未改变.在此种情况下,直接New 一个实例 ...

  8. 精通python设计模式-浅谈Python设计模式 - 原型模式

    声明,本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 在<精通Python设计模式>中把设计模式分为三种类型: 创建型模式 ...

  9. [设计模式]原型模式

    简介 原型模式 (Prototype)用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 原型模式是一种对象创建型模式 (可参考 设计模式 创建型模式). 结构 图-原型模式结构图 Pr ...

最新文章

  1. 闲来无事,总结 Xcode常用快捷键
  2. VS中 无法创建虚拟目录 本地IIS IIS Express 外部主机
  3. darknet: ./src/cuda.c:36: check_error: Assertion `0' failed.
  4. 如何注册域名-买服务器-备案-建设网站
  5. android 手机号码去重,第135天:移动端开发经验总结
  6. sqlplus中批量执行sql脚本(Oracle)
  7. centos有趣软件包_这5个软件包使学习R变得有趣
  8. java utf-8 gbk_Java 字符转码之UTF-8转为GBK/GB2312
  9. 如何让Mosquitto动态加载配置文件
  10. vscode的IntelliCode扩展报错
  11. 【HDU 6020】 MG loves apple (乱搞?)
  12. java基础——java学习心得
  13. Spring常用注解
  14. 孙玄/陈东:聊一聊ZooKeeper的顺序一致性
  15. 投屏电视显示服务器拒绝,投屏投不上去怎么办?投屏方法汇总,总有一种适合你!...
  16. 坐标系之间的旋转平移变换与对应变换矩阵的关系
  17. 翻译小窍门-谢谢你勾引我老公
  18. 排序刷默认值sql脚本
  19. 【TeXstudio】【7】段落,编号与自定义编号——《LaTeX入门》
  20. 02 解方程专题 (各学科:高数、线代、专业课)

热门文章

  1. 第二周项目2-就拿胖子说事
  2. Android之了解ThreadLocal
  3. vs2017编写python_VS2017+VC-LTL编译Python-3.6.4源代码
  4. [转] 利用CORS实现跨域请求
  5. php循环语句for while do while的用法
  6. csdn新版博客初体验
  7. mysql修改最后一条记录删除第一条记录
  8. No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer解决方法
  9. Ace-editor 输入内容时光标闪动,定位错乱的解决方案
  10. ios系统web(微信公众号)开发遇到的问题及解决方案