




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第15章享元模式本章教學內容享元模式模式動機與定義模式結構與分析模式實例與解析模式效果與應用模式擴展享元模式模式動機面向對象技術可以很好地解決一些靈活性或可擴展性問題,但在很多情況下需要在系統(tǒng)中增加類和對象的個數(shù)。當對象數(shù)量太多時,將導致運行代價過高,帶來性能下降等問題。享元模式正是為解決這一類問題而誕生的。享元模式通過共享技術實現(xiàn)相同或相似對象的重用。享元模式模式動機享元模式模式動機在享元模式中可以共享的相同內容稱為內部狀態(tài)(IntrinsicState),而那些需要外部環(huán)境來設置的不能共享的內容稱為外部狀態(tài)(ExtrinsicState),由于區(qū)分了內部狀態(tài)和外部狀態(tài),因此可以通過設置不同的外部狀態(tài)使得相同的對象可以具有一些不同的特征,而相同的內部狀態(tài)是可以共享的。在享元模式中通常會出現(xiàn)工廠模式,需要創(chuàng)建一個享元工廠來負責維護一個享元池(FlyweightPool)用于存儲具有相同內部狀態(tài)的享元對象。享元模式模式動機在享元模式中共享的是享元對象的內部狀態(tài),外部狀態(tài)需要通過環(huán)境來設置。在實際使用中,能夠共享的內部狀態(tài)是有限的,因此享元對象一般都設計為較小的對象,它所包含的內部狀態(tài)較少,這種對象也稱為細粒度對象。享元模式的目的就是使用共享技術來實現(xiàn)大量細粒度對象的復用。享元模式模式定義享元模式(FlyweightPattern):運用共享技術有效地支持大量細粒度對象的復用。系統(tǒng)只使用少量的對象,而這些對象都很相似,狀態(tài)變化很小,可以實現(xiàn)對象的多次復用。由于享元模式要求能夠共享的對象必須是細粒度對象,因此它又稱為輕量級模式,它是一種對象結構型模式。享元模式模式定義FlyweightPattern:Usesharingtosupportlargenumbersoffine-grainedobjectsefficiently.Frequencyofuse:low享元模式模式結構享元模式模式結構享元模式包含如下角色:Flyweight:抽象享元類ConcreteFlyweight:具體享元類UnsharedConcreteFlyweight:非共享具體享元類FlyweightFactory:享元工廠類享元模式模式分析享元模式是一個考慮系統(tǒng)性能的設計模式,通過使用享元模式可以節(jié)約內存空間,提高系統(tǒng)的性能。享元模式模式分析享元模式的核心在于享元工廠類,享元工廠類的作用在于提供一個用于存儲享元對象的享元池,用戶需要對象時,首先從享元池中獲取,如果享元池中不存在,則創(chuàng)建一個新的享元對象返回給用戶,并在享元池中保存該新增對象。
享元模式模式分析典型的享元工廠類代碼:publicclassFlyweightFactory{ privateHashMapflyweights=newHashMap();
publicFlyweightgetFlyweight(Stringkey) { if(flyweights.containsKey(key)) { return(Flyweight)flyweights.get(key); } else { Flyweightfw=newConcreteFlyweight(); flyweights.put(key,fw); returnfw; } }}享元模式模式分析享元模式以共享的方式高效地支持大量的細粒度對象,享元對象能做到共享的關鍵是區(qū)分內部狀態(tài)(InternalState)和外部狀態(tài)(ExternalState)。(1)內部狀態(tài)是存儲在享元對象內部并且不會隨環(huán)境改變而改變的狀態(tài),因此內部狀態(tài)可以共享。(2)外部狀態(tài)是隨環(huán)境改變而改變的、不可以共享的狀態(tài)。享元對象的外部狀態(tài)必須由客戶端保存,并在享元對象被創(chuàng)建之后,在需要使用的時候再傳入到享元對象內部。一個外部狀態(tài)與另一個外部狀態(tài)之間是相互獨立的。
享元模式模式分析典型的享元類代碼:publicclassFlyweight{//內部狀態(tài)作為成員屬性 privateStringintrinsicState;
publicFlyweight(StringintrinsicState) {
rinsicState=intrinsicState; }
publicvoidoperation(StringextrinsicState) { ...... } }享元模式享元模式實例與解析實例一:共享網(wǎng)絡設備(無外部狀態(tài))很多網(wǎng)絡設備都是支持共享的,如交換機、集線器等,多臺終端計算機可以連接同一臺網(wǎng)絡設備,并通過該網(wǎng)絡設備進行數(shù)據(jù)轉發(fā),如圖所示,現(xiàn)用享元模式模擬共享網(wǎng)絡設備的設計原理。享元模式享元模式實例與解析實例一:共享網(wǎng)絡設備(無外部狀態(tài))享元模式享元模式實例與解析實例一:共享網(wǎng)絡設備(無外部狀態(tài))參考代碼(Chapter15Flyweight\sample01)演示……享元模式享元模式實例與解析實例二:共享網(wǎng)絡設備(有外部狀態(tài))雖然網(wǎng)絡設備可以共享,但是分配給每一個終端計算機的端口(Port)是不同的,因此多臺計算機雖然可以共享同一個網(wǎng)絡設備,但必須使用不同的端口。我們可以將端口從網(wǎng)絡設備中抽取出來作為外部狀態(tài),需要時再進行設置。享元模式享元模式實例與解析實例二:共享網(wǎng)絡設備(有外部狀態(tài))享元模式享元模式實例與解析實例二:共享網(wǎng)絡設備(有外部狀態(tài))參考代碼(Chapter15Flyweight\sample02)演示……享元模式模式優(yōu)缺點享元模式的優(yōu)點享元模式的優(yōu)點在于它可以極大減少內存中對象的數(shù)量,使得相同對象或相似對象在內存中只保存一份。享元模式的外部狀態(tài)相對獨立,而且不會影響其內部狀態(tài),從而使得享元對象可以在不同的環(huán)境中被共享。享元模式模式優(yōu)缺點享元模式的缺點享元模式使得系統(tǒng)更加復雜,需要分離出內部狀態(tài)和外部狀態(tài),這使得程序的邏輯復雜化。為了使對象可以共享,享元模式需要將享元對象的狀態(tài)外部化,而讀取外部狀態(tài)使得運行時間變長。享元模式模式適用環(huán)境在以下情況下可以使用享元模式:一個系統(tǒng)有大量相同或者相似的對象,由于這類對象的大量使用,造成內存的大量耗費。對象的大部分狀態(tài)都可以外部化,可以將這些外部狀態(tài)傳入對象中。使用享元模式需要維護一個存儲享元對象的享元池,而這需要耗費資源,因此,應當在多次重復使用享元對象時才值得使用享元模式。享元模式模式應用(1)享元模式在編輯器軟件中大量使用,如在一個文檔中多次出現(xiàn)相同的圖片,則只需要創(chuàng)建一個圖片對象,通過在應用程序中設置該圖片出現(xiàn)的位置,可以實現(xiàn)該圖片在不同地方多次重復顯示。享元模式模式應用(2)在JDK類庫中定義的String類使用了享元模式。publicclassDemo{ publicstaticvoidmain(Stringargs[]) {
Stringstr1="abcd"; Stringstr2="abcd"; Stringstr3="ab"+"cd"; Stringstr4="ab"; str4+="cd";
System.out.println(str1==str2);
System.out.println(str1==str3);
System.out.println(str1==str4); }}享元模式模式擴展單純享元模式和復合享元模式單純享元模式:在單純享元模式中,所有的享元對象都是可以共享的,即所有抽象享元類的子類都可共享,不存在非共享具體享元類。享元模式模式擴展單純享元模式和復合享元模式復合享元模式:將一些單純享元使用組合模式加以組合,可以形成復合享元對象,這樣的復合享元對象本身不能共享,但是它們可以分解成單純享元對象,而后者則可以共享。享元模式模式擴展享元模式與其他模式的聯(lián)用在享元模式的享元工廠類中通常提供一個靜態(tài)的工廠方法用于返回享元對象,使用簡單工廠模式來生成享元對象。在一個系統(tǒng)中,通常只有唯一一個享元工廠,因此享元工廠類可以使用單例模式進行設計。享元模式可以結合組合模式形成復合享元模式,統(tǒng)一對享元對象設置外部狀態(tài)。本章小結享元模式運用共享技術有效地支持大量細粒度對象的復用。系統(tǒng)只使用少量的對象,而這些對象都很相似,狀態(tài)變化很小,可以實現(xiàn)對象的多次復用,它是一種對象結構型模式。享元模式包含四個角色:抽象享元類聲明一個接口,通過它可以接受并作用于外部狀態(tài);具體享元類實現(xiàn)了抽象享元接口,其實例稱為享元對象;非共享具體享元是不能被共享的抽象享元類的子類;享元工廠類用于創(chuàng)建并管理享元對象,它針對抽象享元類編程,將各種類型的具體享元對象存儲在一個享元池中。享元模式以共享的方式高效地支持大量的細粒度對象,享元對象能做到共享的關鍵是區(qū)分內部狀態(tài)和外部狀態(tài)。其中內部狀態(tài)是存儲在享元對象內部并且不會隨環(huán)境改變而改變的狀態(tài),因此內部狀態(tài)可以共享;外部狀態(tài)是隨環(huán)境改變而改變的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國茶閉數(shù)據(jù)監(jiān)測研究報告
- 科技企業(yè)電商運營的數(shù)字化轉型策略
- 科技英語專業(yè)術語與翻譯技巧
- 現(xiàn)代科技在雕塑工藝中的應用研究
- 2025至2030年中國聚四氟乙烯墊料數(shù)據(jù)監(jiān)測研究報告
- 2025年度酒店桑拿足浴項目投資風險評估與管理協(xié)議
- 2025年度電子游戲代理傭金服務合同
- 社交網(wǎng)絡對老年人心理健康的影響分析
- 二零二五年度化肥行業(yè)市場調研代理協(xié)議
- 二零二五年度個人對個人旅游代理合作協(xié)議
- J-STD-033D處理包裝運輸和使用濕度回流和過程敏感設備
- 文聯(lián)述職報告
- 四年級全冊《勞動》課程知識點匯總精排
- SCI期刊的名稱縮寫與全稱對照表
- 人本位醫(yī)療培訓課件
- 《供應鏈管理》課程整體設計
- 水利工程危險源辨識評價及風險管控清單
- 桂西北丹池成礦帶主要金屬礦床成礦特征及成礦規(guī)律
- 申論范文:社區(qū)微治理 共建美好家園
- 高等工程熱力學教案課件
- 2023年征信知識競賽基礎題考試復習題庫(帶答案)
評論
0/150
提交評論