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

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

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

    GOF設計模式學習筆記(二)---Prototype模式

    Posted on 2007-05-14 11:17 久城 閱讀(2529) 評論(5)  編輯  收藏 所屬分類: GOF設計模式
    老板說:“給我蓋一座大樓。”

    工程師說:“蓋什么樣的大樓呢?”

    老板指著身后的一座樓說:“和那個一模一樣的。”

    從老板的角度來講,他采用的就是,Prototype模式,即原型模式。否則,他需要再花費一些時間和工程師一點一點的探討關于大樓的一些設計問題。

    所謂的原型模式,就是用原型實例指定創建對象的種類,并且通過拷貝這些原型創建新的對象。

    JAVA的Object.clone()的存在,使得這個模型的學習變得簡單了許多。

    一.搭橋過河
    過河是一門大學問

    首先研究一下JAVA的clone技術。

    我理解的很簡單,無非是把一個對象進行復制粘貼。那么,來看一下JAVA語言中是如何來實現的這個步驟的。我們依次需要知道以下這些事。

    1.Object對象中有一個clone()方法。而且是protected。

    2.繼承于Object的類一般都可以實現這個方法(有特殊的,比如StringBuffer等,官方定的,不去研究它)。

    3.想被clone的對象需要實現接口Cloneable。如果此對象的類不能實現接口Cloneable,則會拋出CloneNotSupportedExcetion。

    4.所有的數組都被視為實現接口Cloneable。

    5.clone分為淺clone(又稱影子clone)和深clone。

    6.Object類本身不實現接口Cloneable,所以在類為Object的對象上調用clone方法,將會導致在運行時拋出異常。

    首先來看一個能夠實現clone類的小例子。
    //本文代碼參考于http://blog.csdn.net/tiewen/archive/2005/08/05/446301.aspx
    class CloneClass implements Cloneable {
        
    public int aInt;

        
    public Object clone() {
            CloneClass o 
    = null;
            
    try {
                o 
    = (CloneClass) super.clone();
            }
     catch (CloneNotSupportedException e) {
                e.printStackTrace();
            }

            
    return o;
        }

    }

    至于淺clone和深clone,無非就是一個程度問題。再來看一個例子。
    class UnCloneA {
        
    private int i;

        
    public UnCloneA(int ii) {
            i 
    = ii;
        }


        
    public void doublevalue() {
            i 
    *= 2;
        }


        
    public String toString() {
            
    return Integer.toString(i);
        }

    }


    class CloneB implements Cloneable {
        
    public int aInt;

        
    public UnCloneA unCA = new UnCloneA(111);

        
    public Object clone() {
            CloneB o 
    = null;
            
    try {
                o 
    = (CloneB) super.clone();
            }
     catch (CloneNotSupportedException e) {
                e.printStackTrace();
            }

            
    return o;
        }

    }


    class CloneMain {
        
    public static void main(String[] a) {
            CloneB b1 
    = new CloneB();
            b1.aInt 
    = 11;
            System.out.println(
    "before clone,b1.aInt = " + b1.aInt);
            System.out.println(
    "before clone,b1.unCA = " + b1.unCA);
            CloneB b2 
    = (CloneB) b1.clone();
            b2.aInt 
    = 22;
            b2.unCA.doublevalue();
            System.out.println(
    "=================================");
            System.out.println(
    "after clone,b1.aInt = " + b1.aInt);
            System.out.println(
    "after clone,b1.unCA = " + b1.unCA);
            System.out.println(
    "=================================");
            System.out.println(
    "after clone,b2.aInt = " + b2.aInt);
            System.out.println(
    "after clone,b2.unCA = " + b2.unCA);
        }

    }


    輸出結果為:
    /** RUN RESULT:
    before clone,b1.aInt = 11
    before clone,b1.unCA = 111
    =================================
    after clone,b1.aInt = 11
    after clone,b1.unCA = 222
    =================================
    after clone,b2.aInt = 22
    after clone,b2.unCA = 222
    */

    可見,當執行clone這個動作的時候,系統首先開辟一個和它一樣的空間。然后分別對其內容進行復制。復制過程中,如果是基本類型,沒什么說的,直接把值復制過來。如果不是基本類型,復制的則是該類型對象的引用。

    這樣的clone就是所謂的淺clone。那很顯然,如果上面復制的過程中,對于非基本類型實現的不是一個引用復制,而是創建一個新的一樣的對象(其實也是一個clone步驟),那么就是所謂的深clone。對于深度克隆只不過是clone的一種擴展,還有N深clone等等。對于這些,和我們要研究的原型模式沒有多少關系。不想去研究。


    關于JAVA的clone技術,對我來說,理解這些就夠了。其它的,就是進一步的擴展及應用。

    二.以長克短
    什么時候會想到用原型模式呢


    這個我們學習任何一項技術都要問自己的問題。


    要用它,就要知道它的優點。合理的利用它的優點來為我們服務。做人也一樣,不要總拿自己的短處去比別人的長處。要知道,每個人都是不一樣的,每個人都有自己的長處和短處。這就是以長克短。

    JAVA中的clone方法,其實現是native的。這也就意味著它的執行效率是遠高于new一個新對象的。所以,當需要生成大量相似對象的時候,可以考慮下應用clone,也就是原形模式。

    我的項目經驗幾乎為0,單純從理解的角度去想的。

    至于其它的應用,還有待前輩們指點。我再不斷補充。



    歡迎來訪!^.^!
    本BLOG僅用于個人學習交流!
    目的在于記錄個人成長.
    所有文字均屬于個人理解.
    如有錯誤,望多多指教!不勝感激!

    Feedback

    # re: GOF設計模式學習筆記(二)---Prototype模式  回復  更多評論   

    2007-05-14 11:46 by 劉甘泉
    進行clone時候要考慮object的調用修改問題,如果不對object進行修改的話,淺clone是很好的,如果要修改的話會引起問題
    具體好像TIJ(thinking in java)有講,effective java也有講

    # re: GOF設計模式學習筆記(二)---Prototype模式  回復  更多評論   

    2007-05-14 13:23 by 久城
    @劉甘泉
    多謝指教。在網上看到一些文章也是提醒要注意修改時的操作。
    至于修改什么還不是很清楚。
    我想,在應用深度clone的時候,需要重寫Object類中的clone方法,對于基本類型就不用考慮了,對于非基本類型,需要手動的進行“復制”。大家所說的“會引起問題”是出自這里吧?這個“復制”如果也是一個clone,就需要考慮這個非基本類型對象是否允許被clone,這個clone操作是否也是深度clone等問題。
    象StringBuffer這樣的,不可修改的類。就需要手動的“COPY IT!”
    還有一些就需要用到迭代方法,來迭代執行clone方法,達到N深度clone的效果。
    這些我還沒有深入的研究。感覺實踐中用的機會很少。

    # re: GOF設計模式學習筆記(二)---Prototype模式  回復  更多評論   

    2007-05-14 16:20 by 劉甘泉
    @久城
    這個其實就是值與引用的問題,在淺拷貝的時候都是只進行引用的拷貝,基本類型就是直接拷貝,所以在修改的時候,基本類型的修改是沒有問題的,而其他的對象的修改的時候就會修改到堆中的數據,即引用指向的數據。
    對象里面除基本類型都是存儲的引用,即c++的指針指向地址

    # re: GOF設計模式學習筆記(二)---Prototype模式  回復  更多評論   

    2007-05-14 19:07 by 久城
    @劉甘泉
    了解了!^.^!

    # re: GOF設計模式學習筆記(二)---Prototype模式  回復  更多評論   

    2007-10-07 16:42 by wanjinyou
    看到兩位的討論,很有收獲,呵呵

    Copyright © 久城

    主站蜘蛛池模板: 亚洲一区二区三区不卡在线播放| 国产亚洲精品无码专区| 亚洲视频一区在线| 日韩免费的视频在线观看香蕉| 国产乱辈通伦影片在线播放亚洲| 一区二区三区AV高清免费波多| 亚洲美日韩Av中文字幕无码久久久妻妇| 国产精品亚洲а∨无码播放麻豆| 国产一区二区三区在线免费观看| 免费无码又爽又黄又刺激网站| 亚洲?v无码国产在丝袜线观看| 人禽伦免费交视频播放| 亚洲国产一二三精品无码| 免费日本一区二区| 亚洲啪啪免费视频| 成年男女免费视频网站 | 日韩色视频一区二区三区亚洲 | 国产亚洲色视频在线| 成人爽a毛片免费| 亚洲日韩中文字幕天堂不卡| av大片在线无码免费| 噜噜噜亚洲色成人网站| 国产亚洲成人在线播放va| 亚欧免费一级毛片| 亚洲人成电影网站色| jlzzjlzz亚洲乱熟在线播放| 日韩av无码久久精品免费| 最新国产成人亚洲精品影院| 免费a级黄色毛片| 黄页免费在线观看| 国产亚洲精aa在线看| 亚洲中文字幕丝袜制服一区| 久久亚洲免费视频| 亚洲av无码一区二区三区人妖| 亚洲精品动漫人成3d在线| 久久这里只精品99re免费| 亚洲第一男人天堂| 久久久久久久亚洲精品| 日韩亚洲国产高清免费视频| 免费视频成人国产精品网站| 亚洲综合激情另类小说区|