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