<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 262,  comments - 221,  trackbacks - 0

    一、Prototype模式的實(shí)現(xiàn):
     
    1、淺克隆:
     
    a. 提供一個(gè)類作為克隆的原型,該類實(shí)現(xiàn)了Clonable接口
     
    b. 在該類中覆蓋Object類的clone()方法,采用super.clone()方法完成克隆
     
    c. 在外部使用場合先產(chǎn)生一個(gè)原型對(duì)象,然后調(diào)用其clone()方法產(chǎn)生克隆對(duì)象

    2、深克隆:
     
    a. 提供一個(gè)類作為克隆的原型,該類實(shí)現(xiàn)了Serializable接口
     
    b. 在該類中覆蓋Object類的clone()方法,采用序列化的方法完成克隆(對(duì)象流的讀寫)
     
    c.在外部使用場合先產(chǎn)生一個(gè)原型對(duì)象,然后調(diào)用其clone()方法產(chǎn)生克隆對(duì)象


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

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

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

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

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

    ④在派生類中實(shí)現(xiàn)Cloneable接口。
     

    為什么我們?cè)谂缮愔懈采wObject的clone()方法時(shí),一定要調(diào)用super.clone()呢?在運(yùn)行時(shí)刻,Object中的clone()要識(shí)別出你要復(fù)制的是哪一個(gè)對(duì)象,然后為此對(duì)象分配空間,并進(jìn)行對(duì)象的復(fù)制,將原始對(duì)象的內(nèi)容一一復(fù)制到新對(duì)象的存儲(chǔ)空間中。

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

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

    例:

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

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

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


    三、Prototype模式的優(yōu)、缺點(diǎn)和適用場合:

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

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

    綜上所述:Prototype模式最適用的場合應(yīng)該是:當(dāng)幾個(gè)對(duì)象的類僅在屬性上存在一點(diǎn)差異,而行為上完全相同時(shí)。可以在復(fù)制一個(gè)原型對(duì)象后,對(duì)其屬性進(jìn)行細(xì)小的微調(diào),從而實(shí)現(xiàn)定制化的目的。



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

    常用鏈接

    留言簿(21)

    隨筆分類

    隨筆檔案

    BlogJava熱點(diǎn)博客

    好友博客

    搜索

    •  

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 午夜精品在线免费观看| 久香草视频在线观看免费| 亚洲白色白色永久观看| 亚洲视频一区调教| 久久久久亚洲AV无码永不| 久久久久亚洲AV成人无码| 亚洲成人动漫在线| 亚洲国产综合专区电影在线| 久久亚洲精精品中文字幕| 久久久久亚洲av无码专区导航| 77777_亚洲午夜久久多人| 亚洲精品视频在线播放| 亚洲中文无码a∨在线观看| 亚洲黄色网址大全| 亚洲一级毛片免费观看| 亚洲无码一区二区三区| 99亚洲乱人伦aⅴ精品| 边摸边脱吃奶边高潮视频免费| 日韩免费高清一级毛片| xxxxx做受大片在线观看免费| 黄桃AV无码免费一区二区三区| 野花香高清视频在线观看免费| 无码免费一区二区三区免费播放| 91福利视频免费| 久久久久国产精品免费免费搜索 | 亚洲福利电影一区二区?| 亚洲午夜电影一区二区三区| 亚洲午夜在线播放| 国产一区二区三区亚洲综合| 黄视频在线观看免费| 99久久精品国产免费| 成年人免费视频观看| 亚洲日本一区二区三区在线不卡| 一本色道久久综合亚洲精品| 亚洲美女在线观看播放| 亚洲欧美成aⅴ人在线观看| xvideos永久免费入口| 91香蕉国产线在线观看免费 | sss日本免费完整版在线观看| 欧洲人免费视频网站在线| 在线观看AV片永久免费|