原型模型

原型模型的定义

用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。

原型模式的使用场景

  1. 类初始化需要消化非常多的资源,这个资源包括数据,硬件资源等,通过原型拷贝避免这些消耗。
  2. 通过 new 产生一个对象需要繁琐的数据准备或访问权限,这时可以使用原型模式。
  3. 一个对象需要提供给其他对象访问,而且各个调用者可能需要修改其值时,可以考虑使用原型模型拷贝多个对象供调用者使用,即保护拷贝。

原型模型的 UML 类图

角色介绍:

  • Client:客户端用户
  • Prototype: 抽象类或者接口,声明具备clone 能力
  • ConcretePrototype: 具体的原型类。

原型模型的简单实现

下面用简单的文档拷贝为例演示一下简单的原型模式,当我们修改文档时,一般会将当前文档拷贝一份,然后在文档副本上进行修改,这个就是我们这个案例的基础。

/*
* 文档类型,扮演的是 ConcretePrototype 角色,而 cloneable是代表 protorype角色
* */
public class WordDocument implements Cloneable{// 文本private String mText;// 图片名列表private ArrayList<String> mImages =  new ArrayList<String>();public WordDocument(){System.out.println("------------ WordDocument 构造函数——------");}protected WordDocument clone(){try{WordDocument document =(WordDocument) super.clone();document.mText = this.mText;document.mImages = this.mImages;return document;} catch (CloneNotSupportedException e) {}return null;}public String getmText(){return mText;}public void setmText(String mText) {this.mText = mText;}public List<String> getmImages() {return mImages;}public void addImage(String img){this.mImages.add(img);}/** 打印文档内容* */public void showDocument(){System.out.println("------------ Word content start ——------");System.out.println("text: "+ mText);System.out.println("Images List:");for (String imgName : mImages){System.out.println("iamge name : "+ imgName);}System.out.println("------------ Word content end——------");}}

通过 WordDocument 类模拟了 word 文档中的基本元素,即图片和文字。 WordDocument 中的clone 方法用以实现对象克隆。

public class Client {public static void main(String[] args) {// 构建文档对象WordDocument document = new WordDocument();// 编辑文档,添加图片等document.setmText("这是一篇文档");document.addImage("图片1");document.addImage("图片2");document.addImage("图片3");document.showDocument();// 以原始文档为原型,拷贝一份副本WordDocument document1 = document.clone();document1.showDocument();// 修改文档副本,不会影响原始文档document1.setmText("这是修改的doc2文本");document1.showDocument();document.showDocument();}
}

运行结果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L6TjGouh-1664930332652)(设计模式解析.assets/image-20220709101742205.png)]

浅拷贝和深拷贝

上面的原型拷贝实际上只是一个浅拷贝,这并不是将原始文档的所有字段都重新构造了一遍,而是副本文档的字段引用了原始文档的字段。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WtPoexoi-1664930332655)(设计模式解析.assets/image-20220709102243961.png)]

将main 函数的内容修改一下:

public static void main(String[] args) {// 构建文档对象WordDocument document = new WordDocument();// 编辑文档,添加图片等document.setmText("这是一篇文档");document.addImage("图片1");document.addImage("图片2");document.addImage("图片3");document.showDocument();// 以原始文档为原型,拷贝一份副本WordDocument document1 = document.clone();document1.showDocument();// 修改文档副本,不会影响原始文档document1.setmText("这是修改的doc2文本");document1.addImage("哈哈.jpg");document1.showDocument();document.showDocument();}

运行结果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-quDRLsjn-1664930332656)(设计模式解析.assets/image-20220709103832887.png)]

从上面的运行结果,我们可以发现,最后两个文档的输出信息是一致的,这是因为备份文档只是引用原文档的地址,当备份文档增加一个图片时,原文档也会收到影响。这就是浅拷贝对象,如何解决这个问题呢,使用下面的代码实现深拷贝, clone 方法修改如下:

protected WordDocument clone(){try{WordDocument document =(WordDocument) super.clone();document.mText = this.mText;// 对 mImages 对象也调用 clone() 函数,进行深拷贝document.mImages = (ArrayList<String>) this.mImages.clone();return document;} catch (CloneNotSupportedException e) {}return null;
}

原型模型的核心问题就是对原始对象进行拷贝,这个模式的使用过程中需要注意的就是:深、浅拷贝的问题,建议在使用该模式时尽量使用深拷贝,避免操作副本时影响原始对象的问题。

原型模型优缺点

优点:

原型模型是内存中二进制流的拷贝,要比直接 new 一个对象性能好很多,特别是要在一个循环体内产生大量的对象时,原型模型可以更好地体现其优点。

缺点:

这既是它的优点也是缺点,直接在内存中拷贝,构造函数是不会执行的,实际开发当中应该注意这个潜在的问题,优点就是减少了约束,缺点也是减少了约束,需要大家在实际开发时考虑。

设置模式之-------原型模型相关推荐

  1. 创建型模式——原型模型(Prototype Pattern)

    开头 还记得小时候我们写作业,老师说:"佳兴,你英语单词填写怎么又错了,把这个句子抄写十遍",可怜的我只能一遍一遍默默的抄写.当时我就想,如果我有钱了,我一定要买一台打印机,后来我 ...

  2. 一口气讲完设计模式(单例模式、工厂模式、原型模式、建造者模式、适配器、桥梁模式)

    设计模式 使用设计模式,可以让我们的代码具有更好的可读性.可扩展性.可读性.重用性.符合高内聚低耦合的特点.作为程序员,是我们经常听到的概念,也是我们程序员必须深入学习,了解的知识. 设计模式种类 该 ...

  3. 软件系统设计-4-建造者模式、原型模式

    1. 建造者模式 1.1. 模式动机 无论是在现实世界中还是在软件系统中,都存在一些复杂的对象,它们拥有多个组成部分,如汽车,它包括车轮.方向盘.发送机等各种部件.而对于大多数用户而言,无须知道这些部 ...

  4. Java设计模式(工厂模式>抽象工厂模式和原型模式)

    Java设计模式Ⅱ 1.工厂模式 1.1 简单工厂模式 1.2 工厂方法模式 2.抽象工厂模式 3.总结 4.原型模式 4.1 原型模式 4.2 浅拷贝 4.3 深拷贝 5.建造者模式 1.工厂模式 ...

  5. 基于快速原型模型建立商业呼叫中心SPOMP的应用研究

    摘要:本文从快速原型(Rapid Prototyping,RP)这一软件生命周期模型的原理出发,结合呼叫中心(Call Center,CC)软件项目外包的现状,提出应用快速原型模型于呼叫中心软件项目的 ...

  6. Javascript 构造函数模式、原型模式

    前两天写完组合继承,打算总结一下原型继承的,不过今天看了一下工厂模式.构造函数模式和原型模式,觉得有必要总结一下以加深印象. ------------------------------------- ...

  7. 项目管理模型总结---原型模型、迭代模型

    原型模型  原型模型--样品模型 原型模型的主要思想: 先借用已有系统作为原型模型,通过"样品"不断改进,使得最后的产品就是用户所需要的. 原型模型通过向用户提供原型获取用户的反馈 ...

  8. 瀑布模型、快速原型模型、螺旋模型优缺点

    在软件开发的几十年实践中,人们总结了很多软件开发模型用来描述和表示一个复杂的开发过程,如: 软件测试与软件的开发模式有着紧密的联系,作为一名测试人员,应该充分理解软件的开发模式,以便找准自己在其中的位 ...

  9. hualinux 编程概念 3.11 快速原型模型:以最快最小代价完成产品特性

    目录 一.前言 二.快速原型介绍 2.1 快速原型概念 2.2 理解例子 2.3 原型种类 2.3.1 低保原型设计:使用线框图 2.3.2 中保原型图 2.3.3 高保真原型图 2.3.4 低中高保 ...

最新文章

  1. 为什么做了梦第二天想不起来_为什么做的梦总是想不起来?科学的解释是……...
  2. python的原则_python 类的使用原则
  3. proteus仿真micropython_基于micropython的滑动平均滤波器
  4. Spring技术栈系列教程-- SpringMVC 、SpringBoot 、SpringCloud
  5. hibernate Restrictions 用法 查询
  6. java 判断是否是昨天_java判断日期是否是今天
  7. 人群与网络:博弈论基本概念
  8. 怎么把苹果手机通讯录导入华为手机_苹果手机资料快速导入华为手机。苹果的ios系统也可以把资料导入安卓!...
  9. Mac 16进制编辑器Hex Friend
  10. Oracle日志切换及频率跟踪脚本
  11. 20191216每日一句
  12. 三菱a系列motion软体_三菱PLC全系列编程电缆制作方法
  13. 三星 android 调试模式设置,三星 W2016 开启USB调试模式
  14. 《卡拉马佐夫兄弟》:父子五人性格概述
  15. 中国杰出前十大程序员_10个值得关注的杰出青少年应用程序开发人员
  16. 深度学习-吴恩达 作业 Tensorflow环境部署
  17. 物联网服务商店 - Nebula浅谈
  18. 服务拆分理论和原理及方法
  19. python实现最大独立集算法_2018校招总结(外企,国内大公司,国内创业公司)...
  20. 移动硬盘中安装操作系统

热门文章

  1. AAC(高级音频编码)帧格式及编码介绍
  2. 如何使用gcore工具获取一个core文件而不重启应用?
  3. ffmpeg API FR NET
  4. Android Qcom USB Driver学习(一)
  5. 微分dx、dy是无穷小吗?
  6. 加解密、PKI与CA基础
  7. [RK3288][Android6.0] USB OTG模式及切换
  8. 数据结构 ---- 哈夫曼树****
  9. 电磁感应、电感与变压器
  10. 因为你是我的英雄音译_我可以成为你的英雄宝贝