




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、享元模式模式動(dòng)機(jī) 面向?qū)ο蠹夹g(shù)可以很好地解決一些靈活性或可擴(kuò)展性問題,但在很多情況下需要在系統(tǒng)中增加類和對(duì)象的個(gè)數(shù)。當(dāng)對(duì)象數(shù)量太多時(shí),將導(dǎo)致運(yùn)行代價(jià)過高,帶來性能下降等問題。 享元模式正是為解決這一類問題而誕生的。享元模式通過共享技術(shù)實(shí)現(xiàn)相同或相似對(duì)象的重用。 第1頁(yè)/共31頁(yè)享元模式模式動(dòng)機(jī)第2頁(yè)/共31頁(yè)享元模式模式動(dòng)機(jī) 在享元模式中可以共享的相同內(nèi)容稱為內(nèi)部狀態(tài)(Intrinsic State),而那些需要外部環(huán)境來設(shè)置的不能共享的內(nèi)容稱為外部狀態(tài)(Extrinsic State),由于區(qū)分了內(nèi)部狀態(tài)和外部狀態(tài),因此可以通過設(shè)置不同的外部狀態(tài)使得相同的對(duì)象可以具有一些不同的特征,而相同的
2、內(nèi)部狀態(tài)是可以共享的。 在享元模式中通常會(huì)出現(xiàn)工廠模式,需要?jiǎng)?chuàng)建一個(gè)享元工廠來負(fù)責(zé)維護(hù)一個(gè)享元池(Flyweight Pool)用于存儲(chǔ)具有相同內(nèi)部狀態(tài)的享元對(duì)象。第3頁(yè)/共31頁(yè)享元模式模式動(dòng)機(jī) 在享元模式中共享的是享元對(duì)象的內(nèi)部狀態(tài),外部狀態(tài)需要通過環(huán)境來設(shè)置。在實(shí)際使用中,能夠共享的內(nèi)部狀態(tài)是有限的,因此享元對(duì)象一般都設(shè)計(jì)為較小的對(duì)象,它所包含的內(nèi)部狀態(tài)較少,這種對(duì)象也稱為細(xì)粒度對(duì)象。享元模式的目的就是使用共享技術(shù)來實(shí)現(xiàn)大量細(xì)粒度對(duì)象的復(fù)用。第4頁(yè)/共31頁(yè)享元模式 模式定義 享元模式(Flyweight Pattern):運(yùn)用共享技術(shù)有效地支持大量細(xì)粒度對(duì)象的復(fù)用。系統(tǒng)只使用少量的對(duì)象
3、,而這些對(duì)象都很相似,狀態(tài)變化很小,可以實(shí)現(xiàn)對(duì)象的多次復(fù)用。由于享元模式要求能夠共享的對(duì)象必須是細(xì)粒度對(duì)象,因此它又稱為輕量級(jí)模式,它是一種對(duì)象結(jié)構(gòu)型模式。第5頁(yè)/共31頁(yè)享元模式 模式定義 Flyweight Pattern: Use sharing to support large numbers of fine-grained objects efficiently. Frequency of use: low 第6頁(yè)/共31頁(yè)享元模式 模式結(jié)構(gòu)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頁(yè)/共31頁(yè)享元模式 模式結(jié)構(gòu) 享元模式包含如下角色: Flyweight: 抽象享元類 ConcreteFlyweight: 具體享元類 UnsharedConcreteFlyweight: 非共享具體享元類 FlyweightFactory: 享元工廠類第8頁(yè)/共31頁(yè)享元模式 模式分析 享元模式是一個(gè)考慮系統(tǒng)性能的設(shè)計(jì)模式,通過使用享元模式可以節(jié)約內(nèi)存空間,提高系統(tǒng)的性能。 第9頁(yè)/共31頁(yè)享元模式 模式分析 享元模式的核心在于享元工廠類,享元工廠類的作用在于提供一個(gè)用于存儲(chǔ)享元對(duì)象的享元池,用戶需要對(duì)象時(shí),首先從
6、享元池中獲取,如果享元池中不存在,則創(chuàng)建一個(gè)新的享元對(duì)象返回給用戶,并在享元池中保存該新增對(duì)象。 第10頁(yè)/共31頁(yè)享元模式 模式分析 典型的享元工廠類代碼: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頁(yè)/共31頁(yè)享元模式 模式分析 享元模式以共享的方式高效地支持大量的細(xì)粒度對(duì)象,享元對(duì)象能做到共享的關(guān)鍵是區(qū)分內(nèi)部狀態(tài)(Internal State)和外部狀態(tài)(External State)。 (1) 內(nèi)部狀態(tài)是存儲(chǔ)在享元對(duì)象內(nèi)部并且不會(huì)隨環(huán)境改變而改變的狀態(tài),因此內(nèi)部狀態(tài)可以共享。 (2) 外部狀態(tài)是隨環(huán)境改變而改變的、不可以共享的狀態(tài)。享元對(duì)象的外部狀態(tài)必須由客戶端保存,并在享元對(duì)象被創(chuàng)建之后,在需要使用的時(shí)候再傳入到享元對(duì)象內(nèi)部。一個(gè)外部狀態(tài)與另一個(gè)外部狀態(tài)之間是相互獨(dú)立的。 第12頁(yè)/共31頁(yè)享元模式 模
8、式分析 典型的享元類代碼:public class Flyweight /內(nèi)部狀態(tài)作為成員屬性private String intrinsicState;public Flyweight(String intrinsicState)rinsicState = intrinsicState;public void operation(String extrinsicState).第13頁(yè)/共31頁(yè)享元模式 享元模式實(shí)例與解析 實(shí)例一:共享網(wǎng)絡(luò)設(shè)備(無外部狀態(tài)) 很多網(wǎng)絡(luò)設(shè)備都是支持共享的,如交換機(jī)、集線器等,多臺(tái)終端計(jì)算機(jī)可以連接同一臺(tái)網(wǎng)絡(luò)設(shè)備,并通過該網(wǎng)絡(luò)設(shè)備進(jìn)行數(shù)據(jù)轉(zhuǎn)發(fā),如圖
9、所示,現(xiàn)用享元模式模擬共享網(wǎng)絡(luò)設(shè)備的設(shè)計(jì)原理。第14頁(yè)/共31頁(yè)享元模式 享元模式實(shí)例與解析 實(shí)例一:共享網(wǎng)絡(luò)設(shè)備(無外部狀態(tài))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頁(yè)/共31頁(yè)享元模式 享元模式實(shí)例與解析 實(shí)例一:共享網(wǎng)絡(luò)設(shè)備(無外部狀態(tài)) 參考代碼 (Chapter 15 Flyweightsample01)演示演示第16頁(yè)/共31頁(yè)享元模式 享元模式實(shí)例與解析 實(shí)例二:共享網(wǎng)絡(luò)設(shè)備(有外部狀態(tài)) 雖然網(wǎng)絡(luò)設(shè)備可以共享,但是分配給每一個(gè)終端計(jì)算機(jī)的端口(Port)是不同的,因此
11、多臺(tái)計(jì)算機(jī)雖然可以共享同一個(gè)網(wǎng)絡(luò)設(shè)備,但必須使用不同的端口。我們可以將端口從網(wǎng)絡(luò)設(shè)備中抽取出來作為外部狀態(tài),需要時(shí)再進(jìn)行設(shè)置。第17頁(yè)/共31頁(yè)享元模式 享元模式實(shí)例與解析 實(shí)例二:共享網(wǎng)絡(luò)設(shè)備(有外部狀態(tài))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頁(yè)/共31頁(yè)享元模
13、式 享元模式實(shí)例與解析 實(shí)例二:共享網(wǎng)絡(luò)設(shè)備(有外部狀態(tài)) 參考代碼 (Chapter 15 Flyweightsample02)演示演示第19頁(yè)/共31頁(yè)享元模式 模式優(yōu)缺點(diǎn) 享元模式的優(yōu)點(diǎn) 享元模式的優(yōu)點(diǎn)在于它可以極大減少內(nèi)存中對(duì)象的數(shù)量,使得相同對(duì)象或相似對(duì)象在內(nèi)存中只保存一份。 享元模式的外部狀態(tài)相對(duì)獨(dú)立,而且不會(huì)影響其內(nèi)部狀態(tài),從而使得享元對(duì)象可以在不同的環(huán)境中被共享。第20頁(yè)/共31頁(yè)享元模式 模式優(yōu)缺點(diǎn) 享元模式的缺點(diǎn) 享元模式使得系統(tǒng)更加復(fù)雜,需要分離出內(nèi)部狀態(tài)和外部狀態(tài),這使得程序的邏輯復(fù)雜化。 為了使對(duì)象可以共享,享元模式需要將享元對(duì)象的狀態(tài)外部化,而讀取外部狀態(tài)使得運(yùn)行時(shí)
14、間變長(zhǎng)。第21頁(yè)/共31頁(yè)享元模式 模式適用環(huán)境 在以下情況下可以使用享元模式: 一個(gè)系統(tǒng)有大量相同或者相似的對(duì)象,由于這類對(duì)象的大量使用,造成內(nèi)存的大量耗費(fèi)。 對(duì)象的大部分狀態(tài)都可以外部化,可以將這些外部狀態(tài)傳入對(duì)象中。 使用享元模式需要維護(hù)一個(gè)存儲(chǔ)享元對(duì)象的享元池,而這需要耗費(fèi)資源,因此,應(yīng)當(dāng)在多次重復(fù)使用享元對(duì)象時(shí)才值得使用享元模式。第22頁(yè)/共31頁(yè)享元模式 模式應(yīng)用 (1)享元模式在編輯器軟件中大量使用,如在一個(gè)文檔中多次出現(xiàn)相同的圖片,則只需要?jiǎng)?chuàng)建一個(gè)圖片對(duì)象,通過在應(yīng)用程序中設(shè)置該圖片出現(xiàn)的位置,可以實(shí)現(xiàn)該圖片在不同地方多次重復(fù)顯示。第23頁(yè)/共31頁(yè)享元模式 模式應(yīng)用 (2)
15、在JDK類庫(kù)中定義的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頁(yè)/共31頁(yè)享元模式 模式擴(kuò)展 單純享元模式和復(fù)合享元模式 單純享元
16、模式單純享元模式:在單純享元模式中,所有的享元對(duì)象都是可以共享的,即所有抽象享元類的子類都可共享,不存在非共享具體享元類。 FlyweightFactory- flyweights : HashMap+ getFlyweight (String key).: FlyweightflyweightsFlyweight+ operation ( extrinsicState).ConcreteFlyweight- intrinsicState : + operation ( extrinsicState).第25頁(yè)/共31頁(yè)享元模式 模式擴(kuò)展 單純享元模式和復(fù)合享元模式 復(fù)合享元模式復(fù)合享元模式:
17、將一些單純享元使用組合模式加以組合,可以形成復(fù)合享元對(duì)象,這樣的復(fù)合享元對(duì)象本身不能共享,但是它們可以分解成單純享元對(duì)象,而后者則可以共享。 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頁(yè)/共31頁(yè)享元模式 模式擴(kuò)展 享元模式與其他模式的聯(lián)用 在享元模式的享元工廠類中通常提供一個(gè)靜態(tài)的工廠方法用于返回享元對(duì)象,使用簡(jiǎn)單工廠模式來生成享元對(duì)象。 在一個(gè)系統(tǒng)中,通常只有唯一一個(gè)享元工廠,因此享元工廠類可以使用單例模式進(jìn)行設(shè)計(jì)。 享元模式可以結(jié)合組合模式形成復(fù)合享元模式,統(tǒng)一對(duì)享元對(duì)象設(shè)置外部狀態(tài)。第27頁(yè)/共31頁(yè)本章小結(jié) 享元模式運(yùn)用共享技術(shù)有效地支持大量細(xì)粒度對(duì)象的復(fù)用。系統(tǒng)只使用少量的對(duì)象,而這些對(duì)象都很相似,狀態(tài)變化很小,可以實(shí)現(xiàn)對(duì)象的多次復(fù)用,它是一種對(duì)象結(jié)構(gòu)型模式。 享元模式包含四個(gè)角色:抽象享元類聲明一個(gè)接口,通過它可以接受并作用于外部狀態(tài);具體享元類實(shí)現(xiàn)了抽象享元接口,其實(shí)例稱為享元對(duì)象;非共享具體享元是不能被共享的抽象享元類的子類;享元工廠類用于創(chuàng)建并管理享元對(duì)象,它針對(duì)抽象享元類編程,將各種類型的具體享元對(duì)象存儲(chǔ)在一個(gè)享元池中。 享元模式以共享的方式高效地支持大量的細(xì)粒度對(duì)象,享元對(duì)象能做到共享的關(guān)鍵是區(qū)分內(nèi)部狀態(tài)和外部狀態(tài)。其中內(nèi)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 倉(cāng)庫(kù)管理合同范例
- 新生兒低血糖癥的臨床護(hù)理
- 買賣汽車中介合同范例
- 橙綠卡校園安全模板
- 醫(yī)療保險(xiǎn)政策在公共衛(wèi)生事件中的作用分析
- ic購(gòu)銷合同范例
- 代辦園林養(yǎng)護(hù)合同范例
- 辦公自動(dòng)化與醫(yī)療數(shù)據(jù)安全的平衡策略
- 醫(yī)患關(guān)系和諧化從溝通策略開始
- 區(qū)塊鏈技術(shù)下的知識(shí)產(chǎn)權(quán)保護(hù)與市場(chǎng)潛力分析
- 消防救援-水域救援-冰域救援技術(shù)課件
- 30萬級(jí)潔凈車間溫濕度標(biāo)準(zhǔn)
- JGT334-2012 建筑外墻用鋁蜂窩復(fù)合板
- 量子力學(xué)主要知識(shí)點(diǎn)復(fù)習(xí)資料
- 初中《道德與法治》課堂有效教學(xué)的建構(gòu)、實(shí)施與創(chuàng)新
- 質(zhì)量風(fēng)險(xiǎn)與機(jī)遇分析評(píng)價(jià)表完整
- 放射免疫技術(shù)(免疫學(xué)檢驗(yàn)課件)
- 寵物美容與護(hù)理PPT全套完整教學(xué)課件
- 北京市行政處罰案卷標(biāo)準(zhǔn)和評(píng)查評(píng)分細(xì)則
- 2000m3低溫球罐設(shè)計(jì)
- 2021年八省聯(lián)考數(shù)學(xué)試卷
評(píng)論
0/150
提交評(píng)論