原型模式是一種建立型設計模式,在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