第 享元模式PPT課件_第1頁(yè)
第 享元模式PPT課件_第2頁(yè)
第 享元模式PPT課件_第3頁(yè)
第 享元模式PPT課件_第4頁(yè)
第 享元模式PPT課件_第5頁(yè)
已閱讀5頁(yè),還剩26頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論