<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>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 實現對象的復用——享元模式(五) 14.5 單純享元模式和復合享元模式 標準的享元模式結構圖中既包含可以共享的具體享元類,也包含不可以共享的非共享具體享元類。但是在實際使用過程中,我們有時候會用到兩種特殊的享元模式:單純享元模式和復合享元模式,下面將對這兩種特殊的享元模式進行簡單的介紹: 1.單純享元模式 在單純享元模式中,所有的具體享元類都是可以共享的,不存在非共享具體享元類。單純享元模式的結構如圖14-6所示: ![](http://my.csdn.net/uploads/201206/15/1339772995_2995.jpg) 圖14-6 單純享元模式結構圖 2.復合享元模式 將一些單純享元對象使用組合模式加以組合,還可以形成復合享元對象,這樣的復合享元對象本身不能共享,但是它們可以分解成單純享元對象,而后者則可以共享。復合享元模式的結構如圖14-7所示: ![](http://my.csdn.net/uploads/201206/15/1339773003_5870.jpg) 圖14-7 復合享元模式結構圖 通過復合享元模式,可以確保復合享元類CompositeConcreteFlyweight中所包含的每個單純享元類ConcreteFlyweight都具有相同的外部狀態,而這些單純享元的內部狀態往往可以不同。如果希望為多個內部狀態不同的享元對象設置相同的外部狀態,可以考慮使用復合享元模式。 14.6 關于享元模式的幾點補充 1.與其他模式的聯用 享元模式通常需要和其他模式一起聯用,幾種常見的聯用方式如下: (1)在享元模式的享元工廠類中通常提供一個靜態的工廠方法用于返回享元對象,使用簡單工廠模式來生成享元對象。 (2)在一個系統中,通常只有唯一一個享元工廠,因此可以使用單例模式進行享元工廠類的設計。 (3)享元模式可以結合組合模式形成復合享元模式,統一對多個享元對象設置外部狀態。 2.享元模式與String類 JDK類庫中的String類使用了享元模式,我們通過如下代碼來加以說明: ``` class Demo { public static void main(String args[]) { String str1 = "abcd"; String str2 = "abcd"; String str3 = "ab" + "cd"; String str4 = "ab"; str4 += "cd"; System.out.println(str1 == str2); System.out.println(str1 == str3); System.out.println(str1 == str4); str2 += "e"; System.out.println(str1 == str2); } } ``` 在Java語言中,如果每次執行類似String str1="abcd"的操作時都創建一個新的字符串對象將導致內存開銷很大,因此如果第一次創建了內容為"abcd"的字符串對象str1,下一次再創建內容相同的字符串對象str2時會將它的引用指向"abcd",不會重新分配內存空間,從而實現了"abcd"在內存中的共享。上述代碼輸出結果如下: ``` true true false false ``` 可以看出,前兩個輸出語句均為true,說明str1、str2、str3在內存中引用了相同的對象;如果有一個字符串str4,其初值為"ab",再對它進行操作str4 += "cd",此時雖然str4的內容與str1相同,但是由于str4的初始值不同,在創建str4時重新分配了內存,所以第三個輸出語句結果為false;最后一個輸出語句結果也為false,說明當對str2進行修改時將創建一個新的對象,修改工作在新對象上完成,而原來引用的對象并沒有發生任何改變,str1仍然引用原有對象,而str2引用新對象,str1與str2引用了兩個完全不同的對象。 擴展 > 關于Java String類這種在修改享元對象時,先將原有對象復制一份,然后在新對象上再實施修改操作的機制稱為“Copy On Write”,大家可以自行查詢相關資料來進一步了解和學習“Copy On Write”機制,在此不作詳細說明。 14.7 享元模式總結 當系統中存在大量相同或者相似的對象時,享元模式是一種較好的解決方案,它通過共享技術實現相同或相似的細粒度對象的復用,從而節約了內存空間,提高了系統性能。相比其他結構型設計模式,享元模式的使用頻率并不算太高,但是作為一種以“節約內存,提高性能”為出發點的設計模式,它在軟件開發中還是得到了一定程度的應用。 1.主要優點 享元模式的主要優點如下: (1) 可以極大減少內存中對象的數量,使得相同或相似對象在內存中只保存一份,從而可以節約系統資源,提高系統性能。 (2) 享元模式的外部狀態相對獨立,而且不會影響其內部狀態,從而使得享元對象可以在不同的環境中被共享。 2.主要缺點 享元模式的主要缺點如下: (1) 享元模式使得系統變得復雜,需要分離出內部狀態和外部狀態,這使得程序的邏輯復雜化。 (2) 為了使對象可以共享,享元模式需要將享元對象的部分狀態外部化,而讀取外部狀態將使得運行時間變長。 3.適用場景 在以下情況下可以考慮使用享元模式: (1) 一個系統有大量相同或者相似的對象,造成內存的大量耗費。 (2) 對象的大部分狀態都可以外部化,可以將這些外部狀態傳入對象中。 (3) 在使用享元模式時需要維護一個存儲享元對象的享元池,而這需要耗費一定的系統資源,因此,應當在需要多次重復使用享元對象時才值得使用享元模式。 練習 > Sunny軟件公司欲開發一個多功能文檔編輯器,在文本文檔中可以插入圖片、動畫、視頻等多媒體資料,為了節約系統資源,相同的圖片、動畫和視頻在同一個文檔中只需保存一份,但是可以多次重復出現,而且它們每次出現時位置和大小均可不同。試使用享元模式設計該文檔編輯器。
                  <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>

                              哎呀哎呀视频在线观看