天天看點

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

上一篇: Shell 變量