zoukankan      html  css  js  c++  java
  • java 的原型模式和clone

     原型模式是一种创建型设计模式,在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

      

  • 相关阅读:
    Vue--Vue-CLI服务命令、项目结构、自定义配置
    Vue--Vue-CLI创建项目
    Git
    前后端vue和django配置
    Django REST framework(DRF)
    Vue各种配置
    Vue组件
    vue项目搭建
    VUE基础
    Django中间件详解
  • 原文地址:https://www.cnblogs.com/xilinch/p/3489342.html
Copyright © 2011-2022 走看看