原型模式是一种创建型设计模式,在java中可以直接调用object.clone()。

原型模式属于对象的创建模式。通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象。这就是选型模式的用意。

    而java中 所有的对象都是 object,在object中 就有了clone() 方法,因此大多数时候大家都不怎么关注,它一般可以与工厂模式一起使用。

    对于clone来说,java中有深克隆 和浅克隆,原文称为: Shallow Clone&Deep Clone,区别在于:

     Object在对某个对象实施Clone时对其是一无所知的,它仅仅是简单地执行域对域的copy,这就是浅克隆Shallow Clone,

     当Object 里面有一个域hireDay不是基本型别的变量,而是一个reference变量,经过Clone之后就会产生一个新的Date型别的reference,它和原始对象中对应的域指向同一个Date对象,这样克隆类就和原始类共享了一部分信息,而这样显然是不利的,这时候就需要深克隆 deep Clone。

    使用深克隆 可以使用对象流复制的方式:

   

一般使用的clone()方法虽然可以实现深度克隆,
但是需要的克隆对象里有其他引用对象,这个引用对象还有引用对象
那么你重写clone()方法就非常的繁琐了
所以建议使用输入输出流进行克隆

/*
* 复制对象obj,类似于值传递,非引用
*/
public static Object cloneObject(Object obj) throws Exception{
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(byteOut);
out.writeObject(obj);
ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
ObjectInputStream in =new ObjectInputStream(byteIn);
return in.readObject();
}

  需要注意的是:对象要实现序列化的接口 :Serializable

  

最新文章

  1. SQL Server 服务器磁盘测试之SQLIO篇(一)
  2. Android之消息机制Handler,Looper,Message解析
  3. 用C#缩小照片上传到各种空间
  4. 线性回归 Linear Regression
  5. iOS-音频和视频
  6. struts2&&Hibernate Demo1
  7. HBase体系结构剖析
  8. tyvj100题留念
  9. Sublime Text3快捷方式与使用技巧
  10. php面向对象的三大特征 封装,继承,多态
  11. 页面modal服务
  12. BZOJ_1613_ [Usaco2007_Jan]_Running_贝茜的晨练计划_(动态规划)
  13. win7+ubuntu双系统安装攻略
  14. 开涛spring3(4.4) - 资源 之 4.4 Resource通配符路径
  15. eclipse 的缓存问题
  16. maven 聚合
  17. HDU 5726 GCD(RMQ+二分)
  18. php 字符编码转换
  19. PHP 在 Mac 的安装之路
  20. RSA加密遇到的一个问题

热门文章

  1. luogu P4231 三步必杀
  2. win8安装wampserver报403错误解决方法
  3. Unity应用发布如何在本地查看Debug输出?
  4. python 使用gRPC
  5. Oracle的分析函数
  6. 【Django笔记一】windows系统下搭建Django项目
  7. PHP连接MySql闪断自动重连的方法
  8. FPGA软硬协同设计学习笔记及基础知识(一)
  9. 高斯消元c++(非常暴力)
  10. 慎用静态类static class