java 的原型模式和clone

简介: 原型模式是一种创建型设计模式,在java中可以直接调用object.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

  

目录
相关文章
|
5月前
|
Java
Java中的对象克隆详解
Java中的对象克隆详解
|
7月前
|
Java C++
java面试基础 -- 深克隆 & 浅克隆
java面试基础 -- 深克隆 & 浅克隆
42 1
|
7月前
|
Java
Java中如何克隆一个对象?
【4月更文挑战第13天】
91 0
|
7月前
|
Java
Java 对象clone
Java 对象clone
|
Java
java中对象的克隆
java中对象的克隆
81 0
|
安全 Java 编译器
Java的对象克隆
Object 类提供的 clone() 方法是 “浅拷贝”,并没有克隆对象中引用的其他对象,原对象和克隆的对象仍然会共享一些信息。深拷贝指的是:在对象中存在其他对象的引用的情况下,会同时克隆对象中引用的其他对象,原对象和克隆的对象互不影响。
133 0
|
JSON Java 数据格式
Java - 关于 Cloneable 接口 clone 方法(二)
Java - 关于 Cloneable 接口 clone 方法(二)
111 0
Java - 关于 Cloneable 接口 clone 方法(二)
|
Java
Java - 关于 Cloneable 接口 clone 方法(一)
Java - 关于 Cloneable 接口 clone 方法(一)
168 0
|
设计模式 Java Spring
Java原型模式(prototype)
prototype模式也就是原型模式,是javaGOF23种设计模式中的一种,我们在学习spring的时候在bean标签的学习中碰到过,所以本文来给大家介绍下原型模式
Java原型模式(prototype)
|
Java
Java复制clone工具类
Java复制clone工具类
190 0