中文字幕日韩一区二区_国产一区二区av_国产毛片av_久久久久国产一区_色婷婷电影_国产一区二区精品

C#面向?qū)ο笤O(shè)計(jì)模式縱橫談:Flyweight 享元模式

  面向?qū)ο蟮拇鷥r

  面向?qū)ο蠛芎玫亟鉀Q了系統(tǒng)抽象性的問題,同時在大多數(shù)情況下,也不會損及系統(tǒng)的性能。但是,在某些特殊的應(yīng)用中,由于對象的數(shù)量太大,采用面向?qū)ο髸o系統(tǒng)帶來難以承受的內(nèi)存開銷。比如圖形應(yīng)用中的圖元等對象、字處理應(yīng)用中的字符對象等。

image

  動機(jī)(Motivation)

  采用純粹對象方案的問題在于大量細(xì)粒度的對象會很快充斥在系統(tǒng)中,從而帶來很高的運(yùn)行時代價——主要指內(nèi)存需求方面的代價。如何在避免大量細(xì)粒度對象問題的同時,讓外部客戶程序仍然能夠透明地使用面向?qū)ο蟮姆绞絹磉M(jìn)行操作?

  意圖(Intent)

  運(yùn)用共享技術(shù)有效地支持大量細(xì)粒度的對象。

            ——《設(shè)計(jì)模式》GoF  

  例說Flyweight應(yīng)用

image

image

  如果是對字符char使用享元模式,本來每個字符只占用2字節(jié),而享元模式要使用指針,至少每個字符需要4字節(jié),這樣就適得其反了,反而消耗了更多的內(nèi)存資源。

image

  但是字體就需要用享元模式了,因?yàn)樗拇笮”茸址蟮枚啵谖覀冞@個例子中有12bytes,如果是它倍乘的話數(shù)量級就很大了,很消耗內(nèi)存。

  其實(shí)更精確地說,對于C#,每一個類還需要有一個虛表指針和做垃圾回收控制的空間,一共占8bytes。因?yàn)镃#中每一個類都是繼承自object類,所以每個類都帶有虛函數(shù)和類型信息。所以Font類應(yīng)該是20bytes的倍乘效應(yīng)。在Charactor類中,char字符占2bytes;Font類型有個指針,占4bytes;還有Font里的20bytes;還有8bytes的虛表指針和垃圾回收;因?yàn)?2位機(jī)器上有一個填充的效應(yīng),char字符還需要額外占用2bytes,需要補(bǔ)齊;因此Charactor類共占36bytes。在客戶代碼中,有100000個Charactor類,那么大約在會帶來3.6M的數(shù)據(jù)。如果是服務(wù)器程序,那么3M數(shù)據(jù)可以接受。但如果字符數(shù)量級再增加,那么開銷是不言而喻的。

  改善結(jié)構(gòu):

image

  Charactor類里的CFont屬性 

image

  這里當(dāng)我們使用Charactor的時候,我們設(shè)置它字體時,如果在它靜態(tài)的Hashtable里面已經(jīng)有的話,我們就把指針直接指向它,就不要再去新建一個字體對象了

image

  客戶代碼中第61行和63行,f1和f2占用兩塊不同的內(nèi)存,但是到了68行和73行,我們實(shí)際上在內(nèi)部透明的把它們轉(zhuǎn)化為讓它們只用f1一塊內(nèi)存,f2的內(nèi)存就不會再讓它持有。

  要注意的是,在.NET里面使用字符串的時候,它實(shí)際上已經(jīng)運(yùn)用了享元模式,比如我們字符串里出了20個“Hello World”,實(shí)際上在系統(tǒng)里面只存了1個“Hello World”,其它的都是用指針指向它。這個前提當(dāng)然是字符串的代價比指針大。

  結(jié)構(gòu)(Structure)

image

  這種結(jié)構(gòu)其實(shí)可以僅作為參考,它并不是一個作為絕對標(biāo)準(zhǔn)化的結(jié)構(gòu)。基本思路實(shí)現(xiàn)是這樣,但是至于是否有必要放到一個靜態(tài)工廠來做,還值得商榷。像我們上面的例子就直接把它放在一個屬性里面去做。

  Flyweight模式的幾個要點(diǎn)

  面向?qū)ο蠛芎玫亟鉀Q了抽象性的問題,但是作為一個運(yùn)行在機(jī)器中的程序?qū)嶓w,我們需要考慮對象的代價問題。Flyweight設(shè)計(jì)模式主要解決面向?qū)ο蟮拇鷥r問題,一般不觸及面向?qū)ο蟮某橄笮詥栴}。Flyweight采用對象共享的做法來降低系統(tǒng)中對象的個數(shù),從而降低細(xì)粒度對象給系統(tǒng)帶來的內(nèi)存壓力。在具體實(shí)現(xiàn)方面,要注意對象狀態(tài)的處理。

  對象的數(shù)量太大從而導(dǎo)致對象內(nèi)存開銷加大——什么樣的數(shù)量才算大?這需要我們仔細(xì)的根據(jù)具體應(yīng)用情況進(jìn)行評估,而不能憑空臆斷。

  .NET架構(gòu)中的Flyweight應(yīng)用

  .NET在C#中有一個Code Behind機(jī)制,它表面有一個ASPx文件,背后又有一個cs文件,它的編譯過程實(shí)際上會把ASPx文件解析成C#文件,然后編譯成dll,在這個過程中,我們在ASPx中寫的任何html代碼都會轉(zhuǎn)化為literal control,literal control是一個一般的文本控件,它就表示html標(biāo)記。當(dāng)這些標(biāo)記有一樣的時候,構(gòu)建控件樹的時候就會用到Flyweight模式.

  它的應(yīng)用并不是那么平凡,只有在效率空間確實(shí)不高的時候我們才用它。

it知識庫C#面向?qū)ο笤O(shè)計(jì)模式縱橫談:Flyweight 享元模式,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 国产区在线视频 | 一区二区三区四区在线免费观看 | 亚洲va欧美va人人爽午夜 | 久久中文字幕在线 | 欧美一a | 超碰成人在线观看 | 国产一区二区三区 | 日韩视频一区在线观看 | 一区二区视频在线 | 国产高清在线 | 毛片1 | 2019天天操| 日韩网站免费观看 | 久久精品国产久精国产 | 久久精品国产a三级三级三级 | 午夜二区 | 国产一区2区| 精品久久久久久久久久久久 | 亚洲精品一区二区三区在线 | 日韩三区在线观看 | av中文字幕在线 | 涩涩视频在线看 | 亚洲国产中文在线 | 奇米影视首页 | 最新午夜综合福利视频 | 中文字幕二区 | 丁香综合 | 在线成人 | 91在线看片 | 亚洲午夜视频 | 粉嫩一区二区三区国产精品 | 日本特黄a级高清免费大片 成年人黄色小视频 | 精品一区二区av | 国产丝袜人妖cd露出 | 风间由美一区二区三区在线观看 | 日韩欧美二区 | 欧美成人a∨高清免费观看 老司机午夜性大片 | 亚洲一区二区三区在线 | 日韩伦理一区二区三区 | 国产精品亚洲综合 | 91porn成人精品 |