天天看點

【23種設計模式】之 原型模式(Prototype Pattern)

模式定義:

用原型執行個體指定建立對象的種類,并且通過複制這些原型建立新的對象。原型模式允許一個對象再建立另外一個可定制的對象,無須知道任何建立的細節。

應用場景:

(1) ​

​ctrl c, ctrl v​

​ 複制,粘貼

(2) struct2 建立action 對象

  在Struts2中為了保證線程的安全性,Action對象的建立使用了原型模式,通路一個已經存在的Action對象時将通過克隆的方式建立出一個新的對象,進而保證其中定義的變量無須進行加鎖實作同步

(3) Spring 可采用原型模式建立Bean類

  在Spring中,使用者也可以采用原型模式來建立新的bean執行個體,進而實作每次擷取的是通過克隆生成的新執行個體,對其進行修改時對原有執行個體對象不造成任何影響

(4)參數傳入。

  參數傳入。若傳入的參數類似List(操作後可能會改變内部排序,資料等等),而又不想其改變,那麼就clone一個傳入。————(忘了再哪本書上看到的。。。)

模式實作:

淺克隆 :

屬性均為基本類型

【23種設計模式】之 原型模式(Prototype Pattern)
【23種設計模式】之 原型模式(Prototype Pattern)

倘若有個複雜屬性

【23種設計模式】之 原型模式(Prototype Pattern)
【23種設計模式】之 原型模式(Prototype Pattern)

是以淺​

​clone​

【23種設計模式】之 原型模式(Prototype Pattern)

深克隆 :

【23種設計模式】之 原型模式(Prototype Pattern)
【23種設計模式】之 原型模式(Prototype Pattern)

是以深​

​clone​

【23種設計模式】之 原型模式(Prototype Pattern)

底層原理:

前言:雖然clone是native,但也阻擋不了我們想象,(^__^) 嘻嘻……
public Object deepClone() throws IOException, ClassNotFoundException, OptionalDataException {
    //将對象寫入流中
    ByteArrayOutputStream bao=new ByteArrayOutputStream();
    ObjectOutputStream oos=new ObjectOutputStream(bao);
    oos.writeObject(this);

    //将對象從流中取出
    ByteArrayInputStream bis=new ByteArrayInputStream(bao.toByteArray());
    ObjectInputStream ois=new ObjectInputStream(bis);
    return(ois.readObject());
}      

繼續閱讀