概念:

原型模式是一种创建型设计模式,Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。


角色:

带Prototype Manager的原型模式:客户(Client)角色:客户端类向原型管理器提出创建对象的请求。

抽象原型(Prototype)角色:这是一个抽象角色,通常由一个C#接口或抽象类实现。此角色给出所有的具体原型类所需的接口。在C#中,抽象原型角色通常实现了ICloneable接口。

具体原型(Concrete Prototype)角色:被复制的对象。此角色需要实现抽象的原型角色所要求的接口。

原型管理器(Prototype Manager)角色:创建具体原型类的对象,并记录每一个被创建的对象。


使用场景:

它主要面对的问题是:“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是他们却拥有比较稳定一致的接口。


DEMO:

浅克隆

浅克隆是指当对象的字段值被复制时,字段引用的对象不会被复制·例如,如果一个对象有一个指向字符串的字段,并且我们对该对象做了一个浅复制,那麽两个对象将引用同一个字符串。·

package com.创建型模式.原型模式;/*** 原型模式 浅克隆* 克隆孙悟空*/
public class MonkeySun implements Cloneable{/*** 名称*/private String name="";/*** 兵器*/private String arms="";public MonkeySun(String name, String arms) {this.name = name;this.arms = arms;}@Overridepublic String toString() {return "MonkeySun{" +"name='" + name + '\'' +", arms='" + arms + '\'' +'}';}/*** 重写克隆方法实现浅克隆* @return* @throws CloneNotSupportedException*/@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}
class test{public static void main(String[] args) {try{MonkeySun monkeySun1=new MonkeySun("孙悟空","如意金箍棒");MonkeySun monkeySun2= (MonkeySun) monkeySun1.clone();System.out.println("monkeySun1 "+monkeySun1.toString());System.out.println("monkeySun2 "+monkeySun2.toString());System.out.println("monkeySun1==monkeySun2 ? " + (monkeySun1 == monkeySun2));}catch (Exception e){e.printStackTrace();}}
}

monkeySun1 MonkeySun{name='孙悟空', arms='如意金箍棒'}
monkeySun2 MonkeySun{name='孙悟空', arms='如意金箍棒'}
monkeySun1==monkeySun2 ? false

进程已结束,退出代码为 0

深克隆

是将指向内容复制到给当前对象新分配的缓冲区中的一种复制方式,相对于浅复制。在Processing, Java 和C++等中会使用到。

是对对象事例中字段引用的对象也进行复制的一种方式.所以,如果一个对象有一个指向字符串的字段,并且对该对象做了一个深复制的话.我们将创建一个新的对象和一个新的字符串.-新对象将指向新字符串。

package com.创建型模式.原型模式;import java.io.*;public class MonkeySun2 implements Serializable {/*** 名称*/private String name="";/*** 兵器*/private String arms="";private Skill skill;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getArms() {return arms;}public void setArms(String arms) {this.arms = arms;}public Skill getSkill() {return skill;}public void setSkill(Skill skill) {this.skill = skill;}@Overridepublic String toString() {return "MonkeySun2{" +"name='" + name + '\'' +", arms='" + arms + '\'' +", skill=" + skill +'}';}public MonkeySun2(String name, String arms, Skill skill) {this.name = name;this.arms = arms;this.skill = skill;}/*** 使用序列化技术实现深克隆* @return* @throws IOException* @throws ClassNotFoundException* @throws OptionalDataException*/public MonkeySun2 deepClone(){try{//将对象写入流中ByteArrayOutputStream bao=new  ByteArrayOutputStream();ObjectOutputStream oos=new  ObjectOutputStream(bao);oos.writeObject(this);//将对象从流中取出ByteArrayInputStream bis=new  ByteArrayInputStream(bao.toByteArray());ObjectInputStream ois=new  ObjectInputStream(bis);return  (MonkeySun2)ois.readObject();}catch (Exception e){e.printStackTrace();return null;}}
}
package com.创建型模式.原型模式;import java.io.Serializable;/*** 孙悟空的技能*/
public class Skill implements Serializable {/*** 七十二变*/private String transfiguration="七十二变";/*** 筋斗云*/private String jinDouyun="筋斗云";public String getTransfiguration() {return transfiguration;}public void setTransfiguration(String transfiguration) {this.transfiguration = transfiguration;}public String getJinDouyun() {return jinDouyun;}public void setJinDouyun(String jinDouyun) {this.jinDouyun = jinDouyun;}@Overridepublic String toString() {return "Skill{" +"transfiguration='" + transfiguration + '\'' +", jinDouyun='" + jinDouyun + '\'' +'}';}
}
class testDeeoClone{public static void main(String[] args) {try{MonkeySun2 monkeySun1=new MonkeySun2("孙悟空","如意金箍棒",new Skill());MonkeySun2 monkeySun2= monkeySun1.deepClone();System.out.println("monkeySun1 "+monkeySun1.toString());System.out.println("monkeySun2 "+monkeySun2.toString());System.out.println("monkeySun1==monkeySun2 ? " + (monkeySun1 == monkeySun2));System.out.println("monkeySun1.Skill==monkeySun2.Skill ? " + (monkeySun1.getSkill() == monkeySun2.getSkill()));}catch (Exception e){e.printStackTrace();}}
}

monkeySun1 MonkeySun2{name='孙悟空', arms='如意金箍棒', skill=Skill{transfiguration='七十二变', jinDouyun='筋斗云'}}
monkeySun2 MonkeySun2{name='孙悟空', arms='如意金箍棒', skill=Skill{transfiguration='七十二变', jinDouyun='筋斗云'}}
monkeySun1==monkeySun2 ? false
monkeySun1.Skill==monkeySun2.Skill ? false

进程已结束,退出代码为 0

设计模式---原型模式相关推荐

  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 ...

  10. Java设计模式——原型模式

    概述 原型模式是为了解决一些不必要的对象创建过程.当Java JDK中提供了Cloneable接口之后,原型模式就变得异常的简单了.虽然由于Cloneable的引入使用程序变得更简单了,不过还是有一些 ...

最新文章

  1. 附加数据时出错,有关详细信息,请单击消息。
  2. 成人高考大学计算机基础答案,江苏省2019年成人高考大学计算机基础统考样卷...
  3. php fuzzy,模糊C均值聚类算法(Fuzzy C-means)
  4. 输入法中的全角和半角是什么,角又是什么
  5. CSS--CSS清除浮动的4种方式
  6. 低配本用win10服务器系统,低配电脑装win10最早版可以吗
  7. Eclipse用法和技巧十七:覆盖父类方法
  8. php后缀名隐藏,php隐藏后缀名的方法是什么
  9. cadsee plus看图纸 7.2.0.1
  10. Linux下用openmp速度反而慢,c-为什么ubuntu 12.04下的OpenMP比串行版本慢
  11. 69. Sqrt(x)
  12. 新买的笔记本计算机内存不足,笔记本内存不够怎么办_笔记本内存不足如何解决...
  13. 树形结构的处理——组合模式(一)
  14. PS用圆角矩形工具画出来的是实线而是虚线,哪里出问题了?
  15. OpenTK探索二:立体纹理贴图
  16. win10查看网卡的vender ID和device ID
  17. php 发 语音验证码,分享一下子语音验证码的php开发流程
  18. 算法:十六进制最大数
  19. 零基础如何学 Web 前端开发?
  20. HP笔记本HDMI检测不到外接显示器

热门文章

  1. 浅析微信支付:公众平台卡券功能开通、HTML5线上发券(JS-SDK接口)、查看卡券详情
  2. html 脚本错误,脚本错误怎么解决,教您脚本错误怎么解决?
  3. 微信小程序校园介绍板
  4. 无人机倾斜摄影测绘工程毕业论文范文
  5. 论文阅读笔记------摄影测量与深度学习
  6. 学计算机应用技术买什么笔记本电脑,大学什么专业用电脑 要不要买电脑
  7. 字幕/打轴/压制小tip——Aegisub MeGUI 极简操作指南
  8. 用VSCode写简历表
  9. Layui模板-laytpl
  10. 【论文笔记】视频分类系列 Temporal Relational Reasoning in Videos (TRN)