设计模式---原型模式
概念:
原型模式是一种创建型设计模式,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
设计模式---原型模式相关推荐
- 设计模式 原型模式_创新设计模式:原型模式
设计模式 原型模式 原型模式用于创建对象的副本. 这种模式非常有用,特别是当从头开始创建对象的成本很高时. 与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 ...
- Java设计模式——原型模式
概述 原型模式是为了解决一些不必要的对象创建过程.当Java JDK中提供了Cloneable接口之后,原型模式就变得异常的简单了.虽然由于Cloneable的引入使用程序变得更简单了,不过还是有一些 ...
最新文章
- 附加数据时出错,有关详细信息,请单击消息。
- 成人高考大学计算机基础答案,江苏省2019年成人高考大学计算机基础统考样卷...
- php fuzzy,模糊C均值聚类算法(Fuzzy C-means)
- 输入法中的全角和半角是什么,角又是什么
- CSS--CSS清除浮动的4种方式
- 低配本用win10服务器系统,低配电脑装win10最早版可以吗
- Eclipse用法和技巧十七:覆盖父类方法
- php后缀名隐藏,php隐藏后缀名的方法是什么
- cadsee plus看图纸 7.2.0.1
- Linux下用openmp速度反而慢,c-为什么ubuntu 12.04下的OpenMP比串行版本慢
- 69. Sqrt(x)
- 新买的笔记本计算机内存不足,笔记本内存不够怎么办_笔记本内存不足如何解决...
- 树形结构的处理——组合模式(一)
- PS用圆角矩形工具画出来的是实线而是虚线,哪里出问题了?
- OpenTK探索二:立体纹理贴图
- win10查看网卡的vender ID和device ID
- php 发 语音验证码,分享一下子语音验证码的php开发流程
- 算法:十六进制最大数
- 零基础如何学 Web 前端开发?
- HP笔记本HDMI检测不到外接显示器
热门文章
- 浅析微信支付:公众平台卡券功能开通、HTML5线上发券(JS-SDK接口)、查看卡券详情
- html 脚本错误,脚本错误怎么解决,教您脚本错误怎么解决?
- 微信小程序校园介绍板
- 无人机倾斜摄影测绘工程毕业论文范文
- 论文阅读笔记------摄影测量与深度学习
- 学计算机应用技术买什么笔记本电脑,大学什么专业用电脑 要不要买电脑
- 字幕/打轴/压制小tip——Aegisub MeGUI 极简操作指南
- 用VSCode写简历表
- Layui模板-laytpl
- 【论文笔记】视频分类系列 	Temporal Relational Reasoning in Videos (TRN)