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

  

原文地址:https://www.cnblogs.com/xilinch/p/3489342.html