【正文】
...... } } 05:21 84 享元模式 ?享元模式實(shí)例與解析 ?實(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ì)原理。 終 端 計(jì) 算 機(jī)集 線 器05:21 85 享元模式 ?享元模式實(shí)例與解析 ?實(shí)例一:共享網(wǎng)絡(luò)設(shè)備(無(wú)外部狀態(tài)) Dev iceF act oryde vice stot alT erm ina l: A rray List: int = ne w A rray List () = 0++++Dev iceF act ory ()getNetwor kDevic e (Str ing ty pe)ge tT ota lDev ice ()ge tT ota lT erm ina l ()...: NetworkDe vice: int: intd e v i ce sNet work Dev ice++ge tT ype ()use ()...: S tring: voidSwit ch type : S tring+++Swit ch (Stri ng typ e)ge tT ype ()use ()...: S tring: voidHub type : S tring+++Hub (St ring typ e)ge tT ype ()use ()...: S tring: void05:21 86 享元模式 ?享元模式實(shí)例與解析 ?實(shí)例一:共享網(wǎng)絡(luò)設(shè)備(無(wú)外部狀態(tài)) ? 參考代碼 演示 …… 05:21 87 享元模式 ?享元模式實(shí)例與解析 ?實(shí)例二:共享網(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è)置。 05:21 88 享元模式 ?享元模式實(shí)例與解析 ?實(shí)例二:共享網(wǎng)絡(luò)設(shè)備(有外部狀態(tài)) Dev iceF act oryde vice stot alT erm ina l: A rray List: int = ne w A rray List () = 0++++Dev iceF act ory ()getNetwor kDevic e (Str ing ty pe)ge tT ota lDev ice ()ge tT ota lT erm ina l ()...: NetworkDe vice: int: intd e v i ce sNet work Dev ice++ge tT ype ()use (Po rt p ort)...: S tring: voidSwit ch type : S tring+++Swit ch (Stri ng typ e)ge tT ype ()use (Po rt p ort)...: S tring: voidHub type : S tring+++Hub (St ring typ e)ge tT ype ()use (Po rt p ort)...: S tring: voidPo rt po rt : S tring+++Po rt (S tring po rt)setPort (String port)ge tPo rt ()...: void: S tring05:21 89 享元模式 ?享元模式實(shí)例與解析 ?實(shí)例二:共享網(wǎng)絡(luò)設(shè)備(有外部狀態(tài)) ? 參考代碼 演示 …… 05:21 90 享元模式 ?模式優(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)境中被共享 。 05:21 91 享元模式 ?模式優(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í)間變長(zhǎng) 。 05:21 92 享元模式 ?模式適用環(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í)才值得使用享元模式 。 05:21 93 享元模式 ? 模式應(yīng)用 ?(1)享元模式在 編輯器軟件 中大量使用,如在一個(gè)文檔中多次出現(xiàn)相同的圖片,則只需要?jiǎng)?chuàng)建一個(gè)圖片對(duì)象,通過(guò)在應(yīng)用程序中設(shè)置該圖片出現(xiàn)的位置,可以實(shí)現(xiàn)該圖片在不同地方多次重復(fù)顯示。 05:21 94 享元模式 ?模式應(yīng)用 ? (2) 在 JDK類庫(kù)中定義的 String類使用了享元模式。 public class Demo { public static void main(String args[]) { String str1 = abcd。 String str2 = abcd。 String str3 = ab + cd。 String str4 = ab。 str4 += cd。 (str1 == str2)。 (str1 == str3)。 (str1 == str4)。 } } 05:21 95 享元模式 ?模式擴(kuò)展 ?單純享元模式和復(fù)合享元模式 ? 單純享元模式 :在單純享元模式中, 所有的享元對(duì)象都是可以共享的 ,即所有抽象享元類的子類都可共享,不存在非共享具體享元類。 Fly we ig ht Fa ct or y fly we ig ht s : H as hM ap+ ge tF lyw ei gh t ( St rin g ke y)...: F lyw ei gh tf l y w e i g h t sFly we ig ht+ op er at io n ( e x trin sic St at e)...Co nc re te Fly we ig ht in trin sic St at e : + op er at io n ( e x trin sic St at e)...05:21 96 享元模式 ?模式擴(kuò)展 ?單純享元模式和復(fù)合享元模式 ? 復(fù)合享元模式 :將一些單純享元使用組合模式加以組合,可以形成復(fù)合享元對(duì)象,這樣的復(fù)合享元對(duì)象本身不能共享,但是它們可以分解成單純享元對(duì)象,而后者則可以共享。 Flyw eig htF act ory flyweights : HashMa p+ ge tFlyw eig ht (Stri ng ke y)...: Flyweightf l y w e i g h t sFlyw eig ht+ op era tion ( e x trins icSt ate )...Con cret eFly weig ht intrin sicS tat e : + op era tion ( e x trins icSt ate )...Com po site Con cret eFly weig ht flyweights : +++op era tion ( e x trins icSt ate )ad d (F lywe igh t fly weig ht)rem ove (Fly weig ht flyw eig ht)...05:21 97 享元模式 ?模式擴(kuò)展 ?享元模式與其他模式的聯(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)。 05:21 98 本節(jié)小結(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ì)象能做到共享的關(guān)鍵是區(qū)分內(nèi)部狀態(tài)和外部狀態(tài)。其中內(nèi)部狀態(tài)是存儲(chǔ)在享元對(duì)象內(nèi)部并且不會(huì)隨環(huán)境改變而改變的狀態(tài),因此內(nèi)部狀態(tài)可以共享;外部狀態(tài)是隨環(huán)境改變而改變的、不可以共享的狀態(tài)。 05:21 99 本節(jié)小結(jié) ? 享元模式主要優(yōu)點(diǎn)在于它可以極大減少內(nèi)存中對(duì)象的數(shù)量,使得相同對(duì)象或相似對(duì)象在內(nèi)存中只保存一份;其缺點(diǎn)是使得系統(tǒng)更加復(fù)雜,并且需要將享元對(duì)象的狀態(tài)外部化,而讀取外部狀態(tài)使得運(yùn)行時(shí)間變長(zhǎng)。 ? 享元模式適用情況包括:一個(gè)系統(tǒng)有大量相同或者相似的對(duì)象,由于這類對(duì)象的大量使用,造成內(nèi)存的大量耗費(fèi);對(duì)象的大部分狀態(tài)都可以外部化,可以將這些外部狀態(tài)傳入對(duì)象中;多次重復(fù)使用享元對(duì)象。 05:21 100 END