天天看點

元對象我所了解的設計模式(C++實作)——享元模式(Flyweight Pattern)

這段時間個人幾篇文章介紹了改元對象的文章. 關聯文章的位址

    想想我們編輯文檔用的wps,文檔裡文字很多都是重複的,我們弗成能為每個湧現的漢字都建立獨立的空間,這樣代價太大,最好的方法就是同享其中雷同的部分,使得需要建立的對象降到最小,這個就是享元模式的核心,即運用同享技巧有效地支援大批細粒度的對象。

    享元對象能做到同享的關鍵是辨識内蘊狀态(Internal State)和外蘊狀态(External State)。内蘊狀态是存儲在享元對象外部并且不會随環境改變而改變。是以内蘊狀态并可以同享。

    外蘊狀态是随環境改變而改變的、弗成以同享的狀态。享元對象的外蘊狀态必須由用戶端儲存,并在享元對象被建立之後,在需要使用的時候再傳入到享元對象外部。外蘊狀态與内蘊狀态是互相獨立的。

元對象我所了解的設計模式(C++實作)——享元模式(Flyweight Pattern)

    抽象享元類(Flyweight)

    它是全部詳細享元類的超類。為這些類規定出需要實作的大衆接口,那些需要外蘊狀态(Exte的操縱可以通過方法的參數傳入。抽象享元的接口使得享元變得可能,但是其實不強制子類實行同享,是以并非全部的享元對象都是可以同享的。

    詳細享元類(ConcreteFlyweight)

    詳細享元類實作了抽象享元類所規定的接口。如果有内蘊狀态的話,必須擔任為内蘊狀态提供存儲空間。享元對象的内蘊狀态必須與對象所處的周圍環境無關,進而使得享元對象可以在系統内同享。有時候詳細享元類又稱為單純詳細享元類,因為複合享元類是由單純詳細享元角色通過複合而成的。

    不能同享的詳細享元類(UnsharableFlyweight)

    不能同享的享元類,又叫做複合享元類。一個複合享元對象是由多個單享元對象構成,這些構成的對象是可以同享的,但是複合享元類本身其實不能同享。

    享元工廠類(FlyweightFactoiy)

    享元工廠類擔任建立和管理享元對象。當一個用戶端對象請求一個享元對象的時候,享元工廠需要檢查系統中是不是已經有一個符合要求的享元對象,如果已經有了,享元工廠角色就應當提供這個已有的享元對象;如果系統中沒有恰當的享元對象的話,享元工廠角色就應當建立一個新的适合的享元對象。

    客戶類(Client)

    客戶類需要自行存儲全部享元對象的外蘊狀态。

    每日一道理

風,那麼輕柔,帶動着小樹、小草一起翩翩起舞,當一陣清風飄來,如同母親的手輕輕撫摸自己的臉龐,我喜歡那種感覺,帶有絲絲涼意,讓人心曠神怡。享受生活,不一定要有山珍海味、菱羅綢緞為伴,大自然便是上帝所賜予人類最為珍貴的。

    1、面向對象很好的處理了抽象性的問題,但是作為一個運作在呆闆中的程式實體,我們需要斟酌對象的代價問題。Flyweight設計模式重要處理面向對象的代價問題,一般不觸及面向對象的抽象性問題。

    2、Flyweight采用對象同享的做法來下降系統中對象的個數,進而下降細粒度對象給系統帶來的記憶體壓力。在詳細實作方面,要注意對象狀态的處理。

    3、享元模式的長處在于它大幅度地下降記憶體中對象的數量。但是,它做到這一點所付出的代價也是很高的:享元模式使得系統更加複雜。為了使對象可以同享,需要将一些狀态外部化,這使得程式的邏輯複雜化。另外它将享元對象的狀态外部化,而讀取外部狀态使得運作時間稍微變長。

    當以下全部的條件都滿足時,可以斟酌使用享元模式:

    1、一個系統有大批的對象。 

    2、這些對象耗費大批的記憶體。 

    3、這些對象的狀态中的大部分都可以外部化。 

    4、這些對象可以按照内蘊狀态分紅很多的組,當把外蘊對象從對象中剔除時,每個組都可以僅用一個對象代替。 

    5、軟體系統不依賴于這些對象的身份,換言之,這些對象可以是弗成分辨的。

    滿足以上的這些條件的系統可以使用享元對象。最後,使用享元模式需要維護一個記錄了系統已有的全部享元的表,而這需要耗費資源。是以,應當在有足夠多的享元執行個體可供同享時才值得使用享元模式。

    享元模式的長處在于它大幅度地下降記憶體中對象的數量。但是,它做到這一點所付出的代價也是很高的:

    1、享元模式使得系統更加複雜。為了使對象可以同享,需要将一些狀态外部化,這使得程式的邏輯複雜化。

    2、享元模式将享元對象的狀态外部化,而讀取外部狀态使得運作時間稍微變長。

    LCL_data原創于CSDN.NET【javascript:void(0)】

文章結束給大家分享下程式員的一些笑話語錄:

IBM和波音777

  波音777是有史以來第一架完全在電腦虛拟現實中設計制造的飛機,所用的裝置完全由IBM公司所提供。試飛前,波音公司的總裁非常熱情的邀請IBM的技術主管去參加試飛,可那位主管卻說道:“啊,非常榮幸,可惜那天是我妻子的生日,So..”..

  波音公司的總載一聽就生氣了:“膽小鬼,我還沒告訴你試飛的日期呢!”

---------------------------------

原創文章 By

元和對象