posts - 262,  comments - 221,  trackbacks - 0

          一、Prototype模式的實現:
           
          1、淺克?。?br />  
          a. 提供一個類作為克隆的原型,該類實現了Clonable接口
           
          b. 在該類中覆蓋Object類的clone()方法,采用super.clone()方法完成克隆
           
          c. 在外部使用場合先產生一個原型對象,然后調用其clone()方法產生克隆對象

          2、深克?。?br />  
          a. 提供一個類作為克隆的原型,該類實現了Serializable接口
           
          b. 在該類中覆蓋Object類的clone()方法,采用序列化的方法完成克隆(對象流的讀寫)
           
          c.在外部使用場合先產生一個原型對象,然后調用其clone()方法產生克隆對象


          二、Prototype模式與深、淺克隆:

          使用Object.clone()方法進行的克隆是“淺克隆”-被復制對象的所有變量都含有與原來的對象相同的值,而所有的對其他對象的引用仍然指向原來的對象。換言之,淺復制僅僅復制所考慮的對象,而不復制它所引用的對象。淺克隆的步驟如下:

          ①為了獲取對象的一份拷貝,我們可以利用Object類的clone()方法。

          ②在派生類中覆蓋基類的clone()方法,并聲明為public。

          ③在派生類的clone()方法中,調用super.clone()。

          ④在派生類中實現Cloneable接口。
           

          為什么我們在派生類中覆蓋Object的clone()方法時,一定要調用super.clone()呢?在運行時刻,Object中的clone()要識別出你要復制的是哪一個對象,然后為此對象分配空間,并進行對象的復制,將原始對象的內容一一復制到新對象的存儲空間中。

          要實現“深克隆”-被復制對象的所有變量都含有與原來的對象相同的值,除去那些引用其他對象的變量。那些引用其他對象的變量將指向被復制過的新對象,而不再是原有的那些被引用的對象。換言之,深復制把要復制的對象所引用的對象都復制了一遍。

          深克隆需要使用Java中提供的對象串行化功能-即把要復制的對象寫入到一個緩沖流,然后通過輸入流讀入,完成對象的復制

          例:

          try {
             // 在內存中開辟一塊緩沖區,用于將自身寫入
             ByteArrayOutputStream bout = new ByteArrayOutputStream();
             ObjectOutputStream out = new ObjectOutputStream(bout);
             // 通過Serialization機制將自身寫入該緩沖區
             out.writeObject(this);
             out.close();

             // 找到剛才開辟的緩沖區準備讀取
             ByteArrayInputStream bin = new ByteArrayInputStream(bout
               .toByteArray());
             ObjectInputStream in = new ObjectInputStream(bin);
             // 將剛才寫入的內容讀入一個新的對象
              Object ret = in.readObject();
             in.close();

             // 返回這個對象,拷貝完畢
             return ret;
            } catch (Exception e) {
             e.printStackTrace();
             return null;
            }


          三、Prototype模式的優、缺點和適用場合:

          使用Prototype模式的一個好處就是可以節省大量的接口實現類的編寫。采用工廠模式的話,如果分別為用戶指定的每種場合都提供一個用戶接口工廠類,將會為我們帶來繁重的工作量。未來避免用戶接口工廠類不斷增加,可以考慮使用Prototype模式。

          而Prototype模式的一個致命的缺點是:Java中的原型方法不允許新對象擁有與父對象不同的方法。這時候,在使用原型方法之前,需要仔細考慮原型方法的利弊,甚至要試一下Prototype模式是否滿足需求。

          綜上所述:Prototype模式最適用的場合應該是:當幾個對象的類僅在屬性上存在一點差異,而行為上完全相同時??梢栽趶椭埔粋€原型對象后,對其屬性進行細小的微調,從而實現定制化的目的。



          -------------------------------------------------------------
          生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。
          posted on 2008-01-02 22:59 Paul Lin 閱讀(2041) 評論(0)  編輯  收藏 所屬分類: 模式與重構
          <2008年1月>
          303112345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(21)

          隨筆分類

          隨筆檔案

          BlogJava熱點博客

          好友博客

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 台东市| 津南区| 正蓝旗| 岫岩| 额济纳旗| 葵青区| 澄江县| 泽州县| 新干县| 什邡市| 长海县| 新乡县| 深水埗区| 东光县| 扶绥县| 佛坪县| 聂拉木县| 泾源县| 防城港市| 名山县| 龙里县| 德州市| 山东省| 万荣县| 客服| 北流市| 枝江市| 古交市| 达尔| 赣榆县| 措勤县| 海安县| 四川省| 黑河市| 阿瓦提县| 阿城市| 化州市| 彰化县| 苏尼特左旗| 桂平市| 静宁县|