設(shè)計模式之:享元模式

本文僅供筆者平時學(xué)習(xí)記錄之用萍鲸,侵刪
原文:https://mp.weixin.qq.com/s/wgif924nydDHWqG9FqTRdg

享元模式

享元模式(英語:Flyweight Pattern)是一種軟件設(shè)計模式骇陈。它使用共享物件坯门,用來盡可能減少內(nèi)存使用量以及分享資訊給盡可能多的相似物件躺盛;它適合用于當(dāng)大量物件只是重復(fù)因而導(dǎo)致無法令人接受的使用大量內(nèi)存肋联。通常物件中的部分狀態(tài)是可以分享故爵。常見做法是把它們放在外部數(shù)據(jù)結(jié)構(gòu),當(dāng)需要使用時再將它們傳遞給享元梗逮。

關(guān)鍵字:減少內(nèi)存项秉,共享物件,外部數(shù)據(jù)

簡單點描述一下就是一批對象中既有相同的內(nèi)容也有不同的內(nèi)容慷彤,相同的內(nèi)容采用共享的方式娄蔼,不同的內(nèi)容通過動態(tài)傳遞的方式,來盡量減少對象的產(chǎn)生底哗。這里需要理解的一點是贷屎,這多個對象其實底層對應(yīng)的是同一個對象,物理地址是一個艘虎。

享元模式使用場景

享元模式的使用場景還是比較多的唉侄,最常見的一個場景就是 Java JDK 里面的 String 字符串類,因為 JVM 中有常量池野建,常量池的實現(xiàn)就是一種享元模式属划,避免多個相同對象的存在恬叹。另外線程池以及很多用到緩沖池的地方都采用了享元模式,比如 Integer 類中默認(rèn)緩存了-128 -127 之間的整數(shù)同眯,等等場景绽昼。

在演示享元模式之前,我們要先了解享元模式中涉及到的幾個角色名稱

  1. 抽象享元類:通常是一個接口须蜗,主要對外提供修改內(nèi)部數(shù)據(jù)的接口
  2. 具體享元類:享元的實現(xiàn)類硅确,通常存儲在內(nèi)存中,便于使用
  3. 享元工廠類:對外創(chuàng)建具體享元類

下面我們通過一個簡單的示例來演示一下享元模式明肮,我們創(chuàng)建一個接口類菱农,然后寫一個實現(xiàn)類,再通過一個工廠來創(chuàng)建享元類柿估,相關(guān)代碼如下:

UML 圖解

image

代碼演示

我們先創(chuàng)建一個接口類 IFlyweight.java循未,里面包含一個設(shè)置寬度的方法,如下

然后編寫一個實現(xiàn)類 FlyweightImpl.java 來實現(xiàn)接口秫舌,并且在構(gòu)造函數(shù)中傳遞一個 Color 對象的妖。

第三步我們再編寫一個工廠類 FlyweightFactory.java,里面有一個 Color 對象的本地緩存足陨,對于相同的顏色只保存一個對象嫂粟。

顏色輔助類 Color.java

最后寫一個測試應(yīng)用類 FlyweightDemo.java

上面測試類中,我們分別定義了兩種顏色的三個對象墨缘,由于相同顏色的對象已經(jīng)被緩存了星虹,所以我們輸出的結(jié)果如下:

輸出結(jié)果

從上面的運行結(jié)果中,我們可以看出飒房,flyweight0 與flyweight1 其實是同一個對象搁凸,雖然他們的 width 和 height 屬性值不一樣,但是他們的底層對應(yīng)的是同一個對象本身狠毯。這就是享元模式的核心內(nèi)容护糖,通過共享變量,來減少對象的產(chǎn)生嚼松,從而減少內(nèi)存的使用嫡良。

總結(jié)

今天跟大家分享了一下設(shè)計模式中的結(jié)構(gòu)型模式之享元模式,享元模式在我們?nèi)粘J褂玫目蚣芎徒M件都有很廣泛的應(yīng)用献酗,希望通過這篇文章能夠幫助大家加深或者理解享元模式寝受,歡迎大家一起討論交流,談?wù)勀闼赖倪€有哪些框架和組件中使用到了享元模式罕偎。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末很澄,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌甩苛,老刑警劉巖蹂楣,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異讯蒲,居然都是意外死亡痊土,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門墨林,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赁酝,“玉大人,你說我怎么就攤上這事旭等∽么簦” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵辆雾,是天一觀的道長肪笋。 經(jīng)常有香客問我月劈,道長度迂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任猜揪,我火速辦了婚禮惭墓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘而姐。我一直安慰自己腊凶,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布拴念。 她就那樣靜靜地躺著钧萍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪政鼠。 梳的紋絲不亂的頭發(fā)上风瘦,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天,我揣著相機(jī)與錄音公般,去河邊找鬼万搔。 笑死,一個胖子當(dāng)著我的面吹牛官帘,可吹牛的內(nèi)容都是我干的瞬雹。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼刽虹,長吁一口氣:“原來是場噩夢啊……” “哼酗捌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤胖缤,失蹤者是張志新(化名)和其女友劉穎馅巷,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體草姻,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡钓猬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了撩独。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片敞曹。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖综膀,靈堂內(nèi)的尸體忽然破棺而出澳迫,到底是詐尸還是另有隱情,我是刑警寧澤剧劝,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布橄登,位于F島的核電站,受9級特大地震影響讥此,放射性物質(zhì)發(fā)生泄漏拢锹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一萄喳、第九天 我趴在偏房一處隱蔽的房頂上張望卒稳。 院中可真熱鬧,春花似錦他巨、人聲如沸充坑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捻爷。三九已至,卻和暖如春份企,著一層夾襖步出監(jiān)牢的瞬間也榄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工薪棒, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留手蝎,地道東北人。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓俐芯,卻偏偏與公主長得像棵介,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子吧史,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,728評論 2 351