原形模式(PrototypePattern, 创建型模式,创建重复对象且保证性能, 对象的克隆)

通常使用原型模式创建一个原型接口, 用于获取创建对象的克隆, 对于浅拷贝与深拷贝不用纠结, 他们二者的区别就在于重写Clonable的clone方法

浅拷贝与深拷贝

浅拷贝: 直接调用Object的clone

public Object clone() {Object clone=null;try {clone=super.clone(); //不用管Object内部元素的情况直接调用Object的clone方法}catch(CloneNotSupportedException e) {e.printStackTrace();}return clone;}

深拷贝: 对clone对象( 此对象内部具有数组/集合/map等复合数据 )内部的数据再进行一次克隆

此处假设clone对象内部有一个ArrayList数组, ArrayList中存储A对象public Object clone() {Object clone=null;try {clone=super.clone();clone.getArray() = new ArrayList<A>(array.size()); //先将内部的ArrayList克隆出来for (int i=0; i < array.size(); i++){// 然后对ArrayList中的数据进行逐一克隆//从数组中获取每个元素, 然后进行克隆, 此处A对象内部没有复合数据, 最后将clone好的数据存入clone的array中clone.getArray().add( (A)array.get(i).clone() );}}catch(CloneNotSupportedException e) {e.printStackTrace();}return clone;}
因为只是调用Object的clone无法对克隆对象内部的数组类型进行复制, 所以还要针对拷贝对象的内部的数组再一次

操作流程

  • 使用方式
 原型模式通过拷贝一个现有对象生成新对象.浅拷贝实现Clonable接口, 重写clone方.深拷贝与浅拷贝一致, 也可以通过实现Serializable读取二进制流1.利用序列化产生的对象是对原对象的复制2.将对象序列化存入缓冲区, 然后将缓冲区对象读出, 用clone的引用指向该对象
  • 角色定义
原型角色:定义用于复制现有的实例来生成新的实例的方法(实现Cloneable接口的类)
具体原型角色:实现用于复制现有实例来生成新实例的方法(具有clone()方法的类)
使用者角色:维护一个注册表, 提供获取clone的类
  • 使用场景
1.资源优化, 类加载需要消耗很多资源, 性能和安全要求高的场景
2.通过new产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模型
3.一个对象,多个修改者
4.大多数原型模式伴随工厂模式出现,通过clone方法创建一个对象,然后由工厂方法提供给调用者
  • 优点
    性能提高,逃避构造函数的约束, 不推荐使用序列化处理clone

  • 缺点
    配备克隆操作需要对类的功能全盘考虑,对已有的类不一定很容易,特别是当一个类饮用不支持串行化的间接对象,或者引用含有循环结构(对象出现多层次的引用); 必须实现Cloneable接口

代码演示:

利用克隆, 事先将一些构造需要高代价的对象放入缓冲区, 然后在下次需要新的对象的时候直接去缓冲区拿( 缓冲区利用clone的方式给新对象, 而不是通过构造函数 )

package com.PrototypePattern;import java.util.Hashtable;public class ShapePrototypePattern {public static void main(String[] args) {//设计一个圆形的缓冲区Shape shape = new Circle();shape.setId("1");ShapeCache.loadCache(shape);//使用对应的图形缓冲区获得克隆对象clone, clone1, clone2Shape clonedShape=ShapeCache.getShape("1");System.out.println("Shape: "+clonedShape.hashCode());Shape clonedShape1=ShapeCache.getShape("1");System.out.println("Shape: "+clonedShape1.hashCode());Shape clonedShape2=ShapeCache.getShape("1");System.out.println("Shape: "+clonedShape2.hashCode());}}
//针对不同的图形设计不同的缓冲区模块克隆模块
class ShapeCache{private static Hashtable<String,Shape>shapeMap=new Hashtable<String,Shape>();//使用get方法获得的图形都是原图形的克隆对象public static Shape getShape(String id) {Shape cachedShape=shapeMap.get(id);return (Shape)cachedShape.clone();}//将new出的对象放入Hashtable, 获得相应的图形直接获取clonepublic static void loadCache(Shape shape) {shapeMap.put(shape.getId(), shape);}
}//原型角色,实现Cloneable接口,调用Object的clone方法
//当具体实现类需要clone的时候就可以直接调用clone
abstract class Shape implements Cloneable{private String id;protected String type;abstract public void draw(); public String getType() {return type;}public String getId() {return id;}public void setId(String id) {this.id=id;}public Object clone() {Object clone=null;try {clone=super.clone();}catch(CloneNotSupportedException e) {e.printStackTrace();}return clone;}
}class Circle extends Shape{public Circle() {type="Circle";}@Overridepublic void draw() {System.out.println("Circle");}
}
class Rectangle extends Shape{public Rectangle() {type="Rectangle";}@Overridepublic void draw() {System.out.println("Rectangle");}
}
class Square extends Shape{public Square() {type="Square";}@Overridepublic void draw() {System.out.println("Square");}
}

结语:

原型模式就是clone, 用于提高性能, 避免构造对象的时候加大资源的开销

上面有错, 还请指出, 如果认为我写的还不错, 还请点个赞, 多多支持一下, O(∩_∩)O~~

设计模式_4_原型模式(对象的拷贝)相关推荐

  1. 设计模式之原型模式以及深浅拷贝的区别

    原型模式也是创建对象的一种方式,它一般用在这样的场景:系统中存在大量相同或相似对象的创建问题,如果用传统的构造函数来创建对象,会比较复杂而且耗费资源.这个时候使用原型模式的克隆方式,能够节省不少时间. ...

  2. 设计模式之原型模式与深浅拷贝

    原型模式 原型模式 背景 克隆问题 改进 代码 应用场景 浅拷贝 深拷贝 注意事项与细节 原型模式 背景 克隆问题 类似过程: //原始对象 User user=new User(); user.se ...

  3. Head First设计模式之原型模式

    一.定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 原型模式是一种比较简单的模式,也非常容易理解,实现一个接口,重写一个方法即完成了原型模式.在实际应用中,原型模式很少单独出现 ...

  4. java 肌汉模式_设计模式之原型模式详解(附源代码)

    原型模式(Prototype Pattern) 原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. ...

  5. 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)

    [索引页] [源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:webabcd 介绍 用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象. ...

  6. 教你如何一篇博客读懂设计模式之—--原型模式

    教你如何一篇博客读懂设计模式之----原型模式 what:是什么 原型模式: 用于创建重复的对象,既不用一个属性一个属性去set和get,又不影响性能,原型模式产生的对象和原有的对象不是同一个实例,他 ...

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

    一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在 ...

  8. 初学Java常用设计模式之——原型模式

    声明:转载请附上原文链接 提示:标题序号从3开始,是照应不同设计模式笔记发布的顺序而定的,比如,第上一篇文章 初学Java常用设计模式之--工厂模式 序号从2开始. 标题后面之所以加上了解,是因为相对 ...

  9. 设计模式回顾——原型模式(C++)

    文章目录 1 前言 2 什么是原型模式 2.1 原型模式组成 2.2 原型模式UML图 2.3 原型模式作用 3 原型模式优缺点 4 什么地方使用原型模式 5 原型模式实现 6 原型模式与构造函数 1 ...

最新文章

  1. 字节跳动AI Lab 再失大将!大牛王长虎被爆已离职回归学界!
  2. docker 查看容器磁盘大小_软件安全 : Docker逃逸详解
  3. 数据蒋堂 | 迭代聚合语法
  4. MYSQL一主多从配置
  5. 属于服务器端运行的程序_Telerik UI for ASP.NET MVC:为任何设备以两倍的速度构建功能丰富且响应迅速的web应用程序...
  6. Android之adb jdwp获取debug版本app的进程Id
  7. 王道考研 计算机网络9 物理层传输介质 双绞线 同轴电缆 光纤
  8. Windows 必备神器 Cmder 使用教程
  9. python表达式352的值为_表达式 3 and 5 的值为
  10. 06Matplotlib数据可视化--6.3折线图和柱状图
  11. 我的媒体播放器——多媒体编程
  12. 从0开始学习 GitHub 系列之「Git 速成」
  13. java 翻译英文_JAVA 一些常用的英文及翻译
  14. com/lsass.exe smss.exe(磁碟机病毒) 感染方式之我分析 -- 2008第一博
  15. java远古部落7723_远古传说之华夏浩劫
  16. 在COMSOL中如何绘制贴片天线的S参数
  17. python里美元怎么表示_说说 Python 正则表达式中的插入字符、美元字符
  18. 已解决:java.sql.SQLException: Value ‘0000-00-00 00:00:00‘ can not be represented as java.sql.Timestamp
  19. 11月24日学习笔记_map/reduct的应用于使用
  20. FINDSTR 命令使用详解

热门文章

  1. 惜缘-致家乡的一位女孩[原创]
  2. 使用phpunit新建项目
  3. python斐波那契前20递归_算法python实现经典递归问题(汉诺塔, 斐波那契数列,阶乘)...
  4. android9叫什么名字,白猜这么多名字!谷歌Android 9.0正式发布:命名Android Pie
  5. Python 自动生成环境依赖包 requirements
  6. CSS中的块元素,内联元素,内联块元素
  7. Flask学习记录之Flask-SQLAlchemy
  8. 给未来的自己一封信计算机,给未来的自己的一封信范文(精选5篇)
  9. C++ Handle(句柄) part1
  10. linux gunzip r .tar,Linux命令之文件归档、压缩、解压缩tar,gzip,gunzip,bzip2,bunz -电脑资料...