<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 對象的克隆——原型模式(四) 7.5 原型管理器的引入和實現 原型管理器(Prototype Manager)是將多個原型對象存儲在一個集合中供客戶端使用,它是一個專門負責克隆對象的工廠,其中定義了一個集合用于存儲原型對象,如果需要某個原型對象的一個克隆,可以通過復制集合中對應的原型對象來獲得。在原型管理器中針對抽象原型類進行編程,以便擴展。其結構如圖7-8所示: ![](http://my.csdn.net/uploads/201204/03/1333465608_5871.gif) 圖7-8 帶原型管理器的原型模式 下面通過模擬一個簡單的公文管理器來介紹原型管理器的設計與實現: Sunny軟件公司在日常辦公中有許多公文需要創建、遞交和審批,例如《可行性分析報告》、《立項建議書》、《軟件需求規格說明書》、《項目進展報告》等,為了提高工作效率,在OA系統中為各類公文均創建了模板,用戶可以通過這些模板快速創建新的公文,這些公文模板需要統一進行管理,系統根據用戶請求的不同生成不同的新公文。 我們使用帶原型管理器的原型模式實現公文管理器的設計,其結構如圖7-9所示: ![](http://my.csdn.net/uploads/201204/03/1333465614_7325.gif) 圖7-9 公文管理器結構圖 以下是實現該功能的一些核心代碼,考慮到代碼的可讀性,我們對所有的類都進行了簡化: ``` import java.util.*; //抽象公文接口,也可定義為抽象類,提供clone()方法的實現,將業務方法聲明為抽象方法 interface OfficialDocument extends Cloneable { public OfficialDocument clone(); public void display(); } //可行性分析報告(Feasibility Analysis Report)類 class FAR implements OfficialDocument { public OfficialDocument clone() { OfficialDocument far = null; try { far = (OfficialDocument)super.clone(); } catch(CloneNotSupportedException e) { System.out.println("不支持復制!"); } return far; } public void display() { System.out.println("《可行性分析報告》"); } } //軟件需求規格說明書(Software Requirements Specification)類 class SRS implements OfficialDocument { public OfficialDocument clone() { OfficialDocument srs = null; try { srs = (OfficialDocument)super.clone(); } catch(CloneNotSupportedException e) { System.out.println("不支持復制!"); } return srs; } public void display() { System.out.println("《軟件需求規格說明書》"); } } //原型管理器(使用餓漢式單例實現) class PrototypeManager { //定義一個Hashtable,用于存儲原型對象 private Hashtable ht=new Hashtable(); private static PrototypeManager pm = new PrototypeManager(); //為Hashtable增加公文對象 private PrototypeManager() { ht.put("far",new FAR()); ht.put("srs",new SRS()); } //增加新的公文對象 public void addOfficialDocument(String key,OfficialDocument doc) { ht.put(key,doc); } //通過淺克隆獲取新的公文對象 public OfficialDocument getOfficialDocument(String key) { return ((OfficialDocument)ht.get(key)).clone(); } public static PrototypeManager getPrototypeManager() { return pm; } } ``` 客戶端代碼如下所示: ``` class Client { public static void main(String args[]) { //獲取原型管理器對象 PrototypeManager pm = PrototypeManager.getPrototypeManager(); OfficialDocument doc1,doc2,doc3,doc4; doc1 = pm.getOfficialDocument("far"); doc1.display(); doc2 = pm.getOfficialDocument("far"); doc2.display(); System.out.println(doc1 == doc2); doc3 = pm.getOfficialDocument("srs"); doc3.display(); doc4 = pm.getOfficialDocument("srs"); doc4.display(); System.out.println(doc3 == doc4); } } ``` 編譯并運行程序,輸出結果如下: ``` 《可行性分析報告》 《可行性分析報告》 false 《軟件需求規格說明書》 《軟件需求規格說明書》 false ``` 在PrototypeManager中定義了一個Hashtable類型的集合對象,使用“鍵值對”來存儲原型對象,客戶端可以通過Key(如“far”或“srs”)來獲取對應原型對象的克隆對象。PrototypeManager類提供了類似工廠方法的getOfficialDocument()方法用于返回一個克隆對象。在本實例代碼中,我們將PrototypeManager設計為單例類,使用餓漢式單例實現,確保系統中有且僅有一個PrototypeManager對象,有利于節省系統資源,并可以更好地對原型管理器對象進行控制。 思考 > 如果需要增加一種新類型的公文,如《項目進展報告》(Project Progress Report, PPR),公文管理器系統源代碼如何修改,動手實踐你的修改方案。 7.6 原型模式總結 原型模式作為一種快速創建大量相同或相似對象的方式,在軟件開發中應用較為廣泛,很多軟件提供的復制(Ctrl + C)和粘貼(Ctrl + V)操作就是原型模式的典型應用,下面對該模式的使用效果和適用情況進行簡單的總結。 1.主要優點 原型模式的主要優點如下: (1) 當創建新的對象實例較為復雜時,使用原型模式可以簡化對象的創建過程,通過復制一個已有實例可以提高新實例的創建效率。 (2) 擴展性較好,由于在原型模式中提供了抽象原型類,在客戶端可以針對抽象原型類進行編程,而將具體原型類寫在配置文件中,增加或減少產品類對原有系統都沒有任何影響。 (3) 原型模式提供了簡化的創建結構,工廠方法模式常常需要有一個與產品類等級結構相同的工廠等級結構,而原型模式就不需要這樣,原型模式中產品的復制是通過封裝在原型類中的克隆方法實現的,無須專門的工廠類來創建產品。 (4) 可以使用深克隆的方式保存對象的狀態,使用原型模式將對象復制一份并將其狀態保存起來,以便在需要的時候使用(如恢復到某一歷史狀態),可輔助實現撤銷操作。 2.主要缺點 原型模式的主要缺點如下: (1) 需要為每一個類配備一個克隆方法,而且該克隆方法位于一個類的內部,當對已有的類進行改造時,需要修改源代碼,違背了“開閉原則”。 (2) 在實現深克隆時需要編寫較為復雜的代碼,而且當對象之間存在多重的嵌套引用時,為了實現深克隆,每一層對象對應的類都必須支持深克隆,實現起來可能會比較麻煩。 3.適用場景 在以下情況下可以考慮使用原型模式: (1) 創建新對象成本較大(如初始化需要占用較長的時間,占用太多的CPU資源或網絡資源),新的對象可以通過原型模式對已有對象進行復制來獲得,如果是相似對象,則可以對其成員變量稍作修改。 (2) 如果系統要保存對象的狀態,而對象的狀態變化很小,或者對象本身占用內存較少時,可以使用原型模式配合備忘錄模式來實現。 (3) 需要避免使用分層次的工廠類來創建分層次的對象,并且類的實例對象只有一個或很少的幾個組合狀態,通過復制原型對象得到新實例可能比使用構造函數創建一個新實例更加方便。 練習 > 設計并實現一個客戶類Customer,其中包含一個名為客戶地址的成員變量,客戶地址的類型為Address,用淺克隆和深克隆分別實現Customer對象的復制并比較這兩種克隆方式的異同。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看