




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、享元模式模式動機 面向對象技術可以很好地解決一些靈活性或可擴展性問題,但在很多情況下需要在系統中增加類和對象的個數。當對象數量太多時,將導致運行代價過高,帶來性能下降等問題。 享元模式正是為解決這一類問題而誕生的。享元模式通過共享技術實現相同或相似對象的重用。 第1頁/共31頁享元模式模式動機第2頁/共31頁享元模式模式動機 在享元模式中可以共享的相同內容稱為內部狀態(Intrinsic State),而那些需要外部環境來設置的不能共享的內容稱為外部狀態(Extrinsic State),由于區分了內部狀態和外部狀態,因此可以通過設置不同的外部狀態使得相同的對象可以具有一些不同的特征,而相同的
2、內部狀態是可以共享的。 在享元模式中通常會出現工廠模式,需要創建一個享元工廠來負責維護一個享元池(Flyweight Pool)用于存儲具有相同內部狀態的享元對象。第3頁/共31頁享元模式模式動機 在享元模式中共享的是享元對象的內部狀態,外部狀態需要通過環境來設置。在實際使用中,能夠共享的內部狀態是有限的,因此享元對象一般都設計為較小的對象,它所包含的內部狀態較少,這種對象也稱為細粒度對象。享元模式的目的就是使用共享技術來實現大量細粒度對象的復用。第4頁/共31頁享元模式 模式定義 享元模式(Flyweight Pattern):運用共享技術有效地支持大量細粒度對象的復用。系統只使用少量的對象
3、,而這些對象都很相似,狀態變化很小,可以實現對象的多次復用。由于享元模式要求能夠共享的對象必須是細粒度對象,因此它又稱為輕量級模式,它是一種對象結構型模式。第5頁/共31頁享元模式 模式定義 Flyweight Pattern: Use sharing to support large numbers of fine-grained objects efficiently. Frequency of use: low 第6頁/共31頁享元模式 模式結構FlyweightFactory- flyweights : HashMap+ getFlyweight (String key).: Flyw
4、eightif(flyweights.containsKey(key) return (Flyweight )flyweights.get(key);else Flyweight fw=new ConcreteFlyweight(); flyweights.put(key,fw); return fw;flyweightsFlyweight+ operation ( extrinsicState).ConcreteFlyweight- intrinsicState : + operation ( extrinsicState).UnsharedConcreteFlyweight- allSta
5、te : + operation ( extrinsicState).第7頁/共31頁享元模式 模式結構 享元模式包含如下角色: Flyweight: 抽象享元類 ConcreteFlyweight: 具體享元類 UnsharedConcreteFlyweight: 非共享具體享元類 FlyweightFactory: 享元工廠類第8頁/共31頁享元模式 模式分析 享元模式是一個考慮系統性能的設計模式,通過使用享元模式可以節約內存空間,提高系統的性能。 第9頁/共31頁享元模式 模式分析 享元模式的核心在于享元工廠類,享元工廠類的作用在于提供一個用于存儲享元對象的享元池,用戶需要對象時,首先從
6、享元池中獲取,如果享元池中不存在,則創建一個新的享元對象返回給用戶,并在享元池中保存該新增對象。 第10頁/共31頁享元模式 模式分析 典型的享元工廠類代碼:public class FlyweightFactoryprivate HashMap flyweights = new HashMap();public Flyweight getFlyweight(String key)if(flyweights.containsKey(key)return (Flyweight)flyweights.get(key);elseFlyweight fw = new ConcreteFlyweight
7、();flyweights.put(key,fw);return fw; 第11頁/共31頁享元模式 模式分析 享元模式以共享的方式高效地支持大量的細粒度對象,享元對象能做到共享的關鍵是區分內部狀態(Internal State)和外部狀態(External State)。 (1) 內部狀態是存儲在享元對象內部并且不會隨環境改變而改變的狀態,因此內部狀態可以共享。 (2) 外部狀態是隨環境改變而改變的、不可以共享的狀態。享元對象的外部狀態必須由客戶端保存,并在享元對象被創建之后,在需要使用的時候再傳入到享元對象內部。一個外部狀態與另一個外部狀態之間是相互獨立的。 第12頁/共31頁享元模式 模
8、式分析 典型的享元類代碼:public class Flyweight /內部狀態作為成員屬性private String intrinsicState;public Flyweight(String intrinsicState)rinsicState = intrinsicState;public void operation(String extrinsicState).第13頁/共31頁享元模式 享元模式實例與解析 實例一:共享網絡設備(無外部狀態) 很多網絡設備都是支持共享的,如交換機、集線器等,多臺終端計算機可以連接同一臺網絡設備,并通過該網絡設備進行數據轉發,如圖
9、所示,現用享元模式模擬共享網絡設備的設計原理。第14頁/共31頁享元模式 享元模式實例與解析 實例一:共享網絡設備(無外部狀態)DeviceFactory-devicestotalTerminal: ArrayList: int = new ArrayList() = 0+DeviceFactory ()getNetworkDevice (String type)getTotalDevice ()getTotalTerminal ().: NetworkDevice: int: intdevicesNetworkDevice+getType ()use ().: String: voidSwi
10、tch- type : String+Switch (String type)getType ()use ().: String: voidHub- type : String+Hub (String type)getType ()use ().: String: void第15頁/共31頁享元模式 享元模式實例與解析 實例一:共享網絡設備(無外部狀態) 參考代碼 (Chapter 15 Flyweightsample01)演示演示第16頁/共31頁享元模式 享元模式實例與解析 實例二:共享網絡設備(有外部狀態) 雖然網絡設備可以共享,但是分配給每一個終端計算機的端口(Port)是不同的,因此
11、多臺計算機雖然可以共享同一個網絡設備,但必須使用不同的端口。我們可以將端口從網絡設備中抽取出來作為外部狀態,需要時再進行設置。第17頁/共31頁享元模式 享元模式實例與解析 實例二:共享網絡設備(有外部狀態)DeviceFactory-devicestotalTerminal: ArrayList: int = new ArrayList() = 0+DeviceFactory ()getNetworkDevice (String type)getTotalDevice ()getTotalTerminal ().: NetworkDevice: int: intdevicesNetworkD
12、evice+getType ()use (Port port).: String: voidSwitch- type : String+Switch (String type)getType ()use (Port port).: String: voidHub- type : String+Hub (String type)getType ()use (Port port).: String: voidPort- port : String+Port (String port)setPort (String port)getPort ().: void: String第18頁/共31頁享元模
13、式 享元模式實例與解析 實例二:共享網絡設備(有外部狀態) 參考代碼 (Chapter 15 Flyweightsample02)演示演示第19頁/共31頁享元模式 模式優缺點 享元模式的優點 享元模式的優點在于它可以極大減少內存中對象的數量,使得相同對象或相似對象在內存中只保存一份。 享元模式的外部狀態相對獨立,而且不會影響其內部狀態,從而使得享元對象可以在不同的環境中被共享。第20頁/共31頁享元模式 模式優缺點 享元模式的缺點 享元模式使得系統更加復雜,需要分離出內部狀態和外部狀態,這使得程序的邏輯復雜化。 為了使對象可以共享,享元模式需要將享元對象的狀態外部化,而讀取外部狀態使得運行時
14、間變長。第21頁/共31頁享元模式 模式適用環境 在以下情況下可以使用享元模式: 一個系統有大量相同或者相似的對象,由于這類對象的大量使用,造成內存的大量耗費。 對象的大部分狀態都可以外部化,可以將這些外部狀態傳入對象中。 使用享元模式需要維護一個存儲享元對象的享元池,而這需要耗費資源,因此,應當在多次重復使用享元對象時才值得使用享元模式。第22頁/共31頁享元模式 模式應用 (1)享元模式在編輯器軟件中大量使用,如在一個文檔中多次出現相同的圖片,則只需要創建一個圖片對象,通過在應用程序中設置該圖片出現的位置,可以實現該圖片在不同地方多次重復顯示。第23頁/共31頁享元模式 模式應用 (2)
15、在JDK類庫中定義的String類使用了享元模式。public class Demopublic 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); 第24頁/共31頁享元模式 模式擴展 單純享元模式和復合享元模式 單純享元
16、模式單純享元模式:在單純享元模式中,所有的享元對象都是可以共享的,即所有抽象享元類的子類都可共享,不存在非共享具體享元類。 FlyweightFactory- flyweights : HashMap+ getFlyweight (String key).: FlyweightflyweightsFlyweight+ operation ( extrinsicState).ConcreteFlyweight- intrinsicState : + operation ( extrinsicState).第25頁/共31頁享元模式 模式擴展 單純享元模式和復合享元模式 復合享元模式復合享元模式:
17、將一些單純享元使用組合模式加以組合,可以形成復合享元對象,這樣的復合享元對象本身不能共享,但是它們可以分解成單純享元對象,而后者則可以共享。 FlyweightFactory- flyweights : HashMap+ getFlyweight (String key).: FlyweightflyweightsFlyweight+ operation ( extrinsicState).ConcreteFlyweight- intrinsicState : + operation ( extrinsicState).CompositeConcreteFlyweight- flyweight
18、s : +operation ( extrinsicState)add (Flyweight flyweight)remove (Flyweight flyweight).第26頁/共31頁享元模式 模式擴展 享元模式與其他模式的聯用 在享元模式的享元工廠類中通常提供一個靜態的工廠方法用于返回享元對象,使用簡單工廠模式來生成享元對象。 在一個系統中,通常只有唯一一個享元工廠,因此享元工廠類可以使用單例模式進行設計。 享元模式可以結合組合模式形成復合享元模式,統一對享元對象設置外部狀態。第27頁/共31頁本章小結 享元模式運用共享技術有效地支持大量細粒度對象的復用。系統只使用少量的對象,而這些對象都很相似,狀態變化很小,可以實現對象的多次復用,它是一種對象結構型模式。 享元模式包含四個角色:抽象享元類聲明一個接口,通過它可以接受并作用于外部狀態;具體享元類實現了抽象享元接口,其實例稱為享元對象;非共享具體享元是不能被共享的抽象享元類的子類;享元工廠類用于創建并管理享元對象,它針對抽象享元類編程,將各種類型的具體享元對象存儲在一個享元池中。 享元模式以共享的方式高效地支持大量的細粒度對象,享元對象能做到共享的關鍵是區分內部狀態和外部狀態。其中內
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 證券投資策略解析的證券從業資格證試題及答案
- 2025年證券從業資格證考試應試導向及學習效能提升試題及答案
- 項目管理市場評估試題及答案
- 注冊會計師復習方法中的知識轉化與情境應用重視策略探討試題及答案
- 審計質量控制的體系建設試題及答案
- 2025年證券從業資格證創新試題及答案
- 銀行從業資格證考試網絡學習資源有效利用及試題答案
- 微生物檢測中的技術規范試題及答案
- 銀行從業資格證考試突破思路試題及答案
- 國際金融認證考試中有效復習策略與總結方法探討試題及答案
- 瓦斯超限事故專項應急預案
- 苗木質量保證措施
- 【公司利潤質量研究國內外文獻綜述3400字】
- 水利工程分部分項劃分表
- 學生班級衛生值日表模板下載
- 粗飼料粉碎機的設計(全套cad圖紙)
- 責任商業聯盟RBA(CSR)知識培訓
- 放射工作人員培訓考核試題及答案
- 鋇安全技術說明書MSDS
- 非對稱十字形配鋼SRC柱抗震性能試驗研究共3篇
- 承插型盤扣式腳手架作業指導書
評論
0/150
提交評論