




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、享元模式享元模式n 模式動(dòng)機(jī)與定義n 模式結(jié)構(gòu)與分析n 模式實(shí)例與解析n 模式效果與應(yīng)用n 模式擴(kuò)展享元模式模式動(dòng)機(jī)n面向?qū)ο蠹夹g(shù)可以很好地解決一些靈活性或可擴(kuò)展性問(wèn)題,但在很多情況下需要在系統(tǒng)中增加類和對(duì)象的個(gè)數(shù)。當(dāng)對(duì)象數(shù)量太多時(shí),將導(dǎo)致運(yùn)行代價(jià)過(guò)高,帶來(lái)性能下降等問(wèn)題。n享元模式正是為解決這一類問(wèn)題而誕生的。享元模式通過(guò)共享技術(shù)實(shí)現(xiàn)相同或相似對(duì)象的重用。 享元模式模式動(dòng)機(jī)享元模式模式動(dòng)機(jī)n在享元模式中可以共享的相同內(nèi)容稱為內(nèi)部狀態(tài)(Intrinsic State),而那些需要外部環(huán)境來(lái)設(shè)置的不能共享的內(nèi)容稱為外部狀態(tài)(Extrinsic State),由于區(qū)分了內(nèi)部狀態(tài)和外部狀態(tài),因此可以
2、通過(guò)設(shè)置不同的外部狀態(tài)使得相同的對(duì)象可以具有一些不同的特征,而相同的內(nèi)部狀態(tài)是可以共享的。 n在享元模式中通常會(huì)出現(xiàn)工廠模式,需要?jiǎng)?chuàng)建一個(gè)享元工廠來(lái)負(fù)責(zé)維護(hù)一個(gè)享元池(Flyweight Pool)用于存儲(chǔ)具有相同內(nèi)部狀態(tài)的享元對(duì)象。享元模式模式動(dòng)機(jī)n在享元模式中共享的是享元對(duì)象的內(nèi)部狀態(tài),外部狀態(tài)需要通過(guò)環(huán)境來(lái)設(shè)置。在實(shí)際使用中,能夠共享的內(nèi)部狀態(tài)是有限的,因此享元對(duì)象一般都設(shè)計(jì)為較小的對(duì)象,它所包含的內(nèi)部狀態(tài)較少,這種對(duì)象也稱為細(xì)粒度對(duì)象。享元模式的目的就是使用共享技術(shù)來(lái)實(shí)現(xiàn)大量細(xì)粒度對(duì)象的復(fù)用。享元模式模式定義n享元模式(Flyweight Pattern):運(yùn)用共享技術(shù)有效地支持大量細(xì)
3、粒度對(duì)象的復(fù)用。系統(tǒng)只使用少量的對(duì)象,而這些對(duì)象都很相似,狀態(tài)變化很小,可以實(shí)現(xiàn)對(duì)象的多次復(fù)用。由于享元模式要求能夠共享的對(duì)象必須是細(xì)粒度對(duì)象,因此它又稱為輕量級(jí)模式,它是一種對(duì)象結(jié)構(gòu)型模式。享元模式模式結(jié)構(gòu)FlyweightFactory- flyweights : HashMap+ getFlyweight (String key).: Flyweightif(flyweights.containsKey(key) return (Flyweight )flyweights.get(key);else Flyweight fw=new ConcreteFlyweight(); flywei
4、ghts.put(key,fw); return fw;flyweightsFlyweight+ operation ( extrinsicState).ConcreteFlyweight- intrinsicState : + operation ( extrinsicState).UnsharedConcreteFlyweight- allState : + operation ( extrinsicState).享元模式模式結(jié)構(gòu)n享元模式包含如下角色:Flyweight: 抽象享元類ConcreteFlyweight: 具體享元類UnsharedConcreteFlyweight: 非共
5、享具體享元類FlyweightFactory: 享元工廠類享元模式模式分析n享元模式是一個(gè)考慮系統(tǒng)性能的設(shè)計(jì)模式,通過(guò)使用享元模式可以節(jié)約內(nèi)存空間,提高系統(tǒng)的性能。 享元模式模式分析n享元模式的核心在于享元工廠類,享元工廠類的作用在于提供一個(gè)用于存儲(chǔ)享元對(duì)象的享元池,用戶需要對(duì)象時(shí),首先從享元池中獲取,如果享元池中不存在,則創(chuàng)建一個(gè)新的享元對(duì)象返回給用戶,并在享元池中保存該新增對(duì)象。 享元模式模式分析n典型的享元工廠類代碼:public class FlyweightFactoryprivate HashMap flyweights = new HashMap();public Flyweig
6、ht getFlyweight(String key)if(flyweights.containsKey(key)return (Flyweight)flyweights.get(key);elseFlyweight fw = new ConcreteFlyweight();flyweights.put(key,fw);return fw; 享元模式模式分析n享元模式以共享的方式高效地支持大量的細(xì)粒度對(duì)象,享元對(duì)象能做到共享的關(guān)鍵是區(qū)分內(nèi)部狀態(tài)(Internal State)和外部狀態(tài)(External State)。 w(1) 內(nèi)部狀態(tài)是存儲(chǔ)在享元對(duì)象內(nèi)部并且不會(huì)隨環(huán)境改變而改變的狀態(tài),因此
7、內(nèi)部狀態(tài)可以共享。 w(2) 外部狀態(tài)是隨環(huán)境改變而改變的、不可以共享的狀態(tài)。享元對(duì)象的外部狀態(tài)必須由客戶端保存,并在享元對(duì)象被創(chuàng)建之后,在需要使用的時(shí)候再傳入到享元對(duì)象內(nèi)部。一個(gè)外部狀態(tài)與另一個(gè)外部狀態(tài)之間是相互獨(dú)立的。 享元模式模式分析n典型的享元類代碼:public class Flyweight /內(nèi)部狀態(tài)作為成員屬性private String intrinsicState;public Flyweight(String intrinsicState)rinsicState = intrinsicState;public void operation(String e
8、xtrinsicState).享元模式享元模式實(shí)例與解析n實(shí)例一:共享網(wǎng)絡(luò)設(shè)備(無(wú)外部狀態(tài))很多網(wǎng)絡(luò)設(shè)備都是支持共享的,如交換機(jī)、集線器等,多臺(tái)終端計(jì)算機(jī)可以連接同一臺(tái)網(wǎng)絡(luò)設(shè)備,并通過(guò)該網(wǎng)絡(luò)設(shè)備進(jìn)行數(shù)據(jù)轉(zhuǎn)發(fā),如圖所示,現(xiàn)用享元模式模擬共享網(wǎng)絡(luò)設(shè)備的設(shè)計(jì)原理。享元模式享元模式實(shí)例與解析n實(shí)例一:共享網(wǎng)絡(luò)設(shè)備(無(wú)外部狀態(tài))DeviceFactory-devicestotalTerminal: ArrayList: int = new ArrayList() = 0+DeviceFactory ()getNetworkDevice (String type)getTotalDevice ()getT
9、otalTerminal ().: NetworkDevice: int: intdevicesNetworkDevice+getType ()use ().: String: voidSwitch- type : String+Switch (String type)getType ()use ().: String: voidHub- type : String+Hub (String type)getType ()use ().: String: void享元模式享元模式實(shí)例與解析n實(shí)例一:共享網(wǎng)絡(luò)設(shè)備(無(wú)外部狀態(tài))參考代碼 (sample01)演示演示享元模式享元模式實(shí)例與解析n實(shí)例二
10、:共享網(wǎng)絡(luò)設(shè)備(有外部狀態(tài))雖然網(wǎng)絡(luò)設(shè)備可以共享,但是分配給每一個(gè)終端計(jì)算機(jī)的端口(Port)是不同的,因此多臺(tái)計(jì)算機(jī)雖然可以共享同一個(gè)網(wǎng)絡(luò)設(shè)備,但必須使用不同的端口。我們可以將端口從網(wǎng)絡(luò)設(shè)備中抽取出來(lái)作為外部狀態(tài),需要時(shí)再進(jìn)行設(shè)置。享元模式享元模式實(shí)例與解析n實(shí)例二:共享網(wǎng)絡(luò)設(shè)備(有外部狀態(tài))DeviceFactory-devicestotalTerminal: ArrayList: int = new ArrayList() = 0+DeviceFactory ()getNetworkDevice (String type)getTotalDevice ()getTotalTerminal
11、 ().: NetworkDevice: int: intdevicesNetworkDevice+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 (Strin
12、g port)getPort ().: void: String享元模式享元模式實(shí)例與解析n實(shí)例二:共享網(wǎng)絡(luò)設(shè)備(有外部狀態(tài))參考代碼 (sample02)演示演示享元模式模式優(yōu)缺點(diǎn)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)境中被共享。享元模式模式優(yōu)缺點(diǎn)n享元模式的缺點(diǎn)享元模式使得系統(tǒng)更加復(fù)雜,需要分離出內(nèi)部狀態(tài)和外部狀態(tài),這使得程序的邏輯復(fù)雜化。為了使對(duì)象可以共享,享元模式需要將享元對(duì)象的狀態(tài)外部化,而讀取外部狀態(tài)使得運(yùn)行時(shí)間變長(zhǎng)。享元模式模式適
13、用環(huán)境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í)才值得使用享元模式。享元模式模式應(yīng)用n(1)享元模式在編輯器軟件中大量使用,如在一個(gè)文檔中多次出現(xiàn)相同的圖片,則只需要?jiǎng)?chuàng)建一個(gè)圖片對(duì)象,通過(guò)在應(yīng)用程序中設(shè)置該圖片出現(xiàn)的位置,可以實(shí)現(xiàn)該圖片在不同地方多次重復(fù)顯示。享元模式模式應(yīng)用n(2) 在JDK類庫(kù)中定義的String類使用了享元模式。public class Demopu
14、blic 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); 享元模式模式擴(kuò)展n單純享元模式和復(fù)合享元模式 單純享元模式單純享元模式:在單純享元模式中,所有的享元對(duì)象都是可以共享的,即所有抽象享元類的子類都可共享,不存在非共
15、享具體享元類。 FlyweightFactory- flyweights : HashMap+ getFlyweight (String key).: FlyweightflyweightsFlyweight+ operation ( extrinsicState).ConcreteFlyweight- intrinsicState : + operation ( extrinsicState).享元模式模式擴(kuò)展n單純享元模式和復(fù)合享元模式 復(fù)合享元模式復(fù)合享元模式:將一些單純享元使用組合模式加以組合,可以形成復(fù)合享元對(duì)象,這樣的復(fù)合享元對(duì)象本身不能共享,但是它們可以分解成單純享元對(duì)象,而后者
16、則可以共享。 FlyweightFactory- flyweights : HashMap+ getFlyweight (String key).: FlyweightflyweightsFlyweight+ operation ( extrinsicState).ConcreteFlyweight- intrinsicState : + operation ( extrinsicState).CompositeConcreteFlyweight- flyweights : +operation ( extrinsicState)add (Flyweight flyweight)remove
17、(Flyweight flyweight).享元模式模式擴(kuò)展n享元模式與其他模式的聯(lián)用 在享元模式的享元工廠類中通常提供一個(gè)靜態(tài)的工廠方法用于返回享元對(duì)象,使用簡(jiǎn)單工廠模式來(lái)生成享元對(duì)象。在一個(gè)系統(tǒng)中,通常只有唯一一個(gè)享元工廠,因此享元工廠類可以使用單例模式進(jìn)行設(shè)計(jì)。享元模式可以結(jié)合組合模式形成復(fù)合享元模式,統(tǒng)一對(duì)享元對(duì)象設(shè)置外部狀態(tài)。小結(jié)享元模式運(yùn)用共享技術(shù)有效地支持大量細(xì)粒度對(duì)象的復(fù)用。系統(tǒng)只使用少量的對(duì)象,而這些對(duì)象都很相似,狀態(tài)變化很小,可以實(shí)現(xiàn)對(duì)象的多次復(fù)用,它是一種對(duì)象結(jié)構(gòu)型模式。享元模式包含四個(gè)角色:抽象享元類聲明一個(gè)接口,通過(guò)它可以接受并作用于外部狀態(tài);具體享元類實(shí)現(xiàn)了抽象享元接口,其實(shí)例稱為享元對(duì)象;非共享具體享元是不能被共享的抽象享元類的子類;享元工廠類用于創(chuàng)建并管理享元對(duì)象,它針對(duì)抽象享元類編程,將各種類型的具體享元對(duì)象存儲(chǔ)在一個(gè)享元池中。享元模式以共享的方式高效地支持大量的細(xì)粒度對(duì)象,享元對(duì)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 安全生產(chǎn)禁止
- 2025年中國(guó)病歷車行業(yè)市場(chǎng)發(fā)展前景及發(fā)展趨勢(shì)與投資戰(zhàn)略研究報(bào)告
- 2025屆上海市寶山區(qū)高境一中高一下化學(xué)期末質(zhì)量檢測(cè)試題含解析
- 云南省安全生產(chǎn)標(biāo)準(zhǔn)化
- 2025年中國(guó)切削刀具制造行業(yè)全景評(píng)估及投資規(guī)劃建議報(bào)告
- 江蘇省淮安市第一山中學(xué)2025年高一化學(xué)第二學(xué)期期末統(tǒng)考模擬試題含解析
- 玉石首飾養(yǎng)護(hù)技術(shù)課件
- 四川省樹(shù)德中學(xué)2025屆高一下化學(xué)期末檢測(cè)模擬試題含解析
- 犬病診療技術(shù)課件
- 上海建平中學(xué)2025屆化學(xué)高一下期末經(jīng)典模擬試題含解析
- 2024年全球及中國(guó)神經(jīng)康復(fù)外骨骼機(jī)器人行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 2025年銅仁沿河土家族自治縣“特崗計(jì)劃”招聘考試筆試試題(含答案)
- 江蘇省連云港市2024-2025學(xué)年高二年級(jí)上冊(cè)期末調(diào)研考試物理試題(選修)解析版
- 2025安全生產(chǎn)月主題宣講課件十:主要負(fù)責(zé)人安全公開(kāi)課
- 如何提升安全管理水平
- 地板拆除合同協(xié)議書
- 退贓協(xié)議書范本
- 【MOOC答案】《大學(xué)物理I力學(xué)、相對(duì)論、電磁學(xué)》(北京交通大學(xué))章節(jié)作業(yè)慕課答案
- 落地投資協(xié)議書范本
- 托管倉(cāng)庫(kù)合同協(xié)議
- 企業(yè)負(fù)責(zé)人(A證)考試題(含答案)
評(píng)論
0/150
提交評(píng)論