如何讓孩子愛上設(shè)計模式 ——12.享元模式(Flyweight Pattern)

標(biāo)簽: 設(shè)計模式初涉


場景引入

有時在開發(fā)中伟葫,可能我們需要創(chuàng)建大量的相同的重復(fù)對象,比如游戲開發(fā)中院促,
場景貼圖的筏养,一個森林的場景,要有有成千上萬的樹常拓,如果為每棵樹都實例化
不同的模型渐溶,估計會把你電腦給炸了。使用享元模式可以解決這個問題弄抬,
抽取出所有樹對象的共有屬性茎辐,并轉(zhuǎn)移到一個單獨的類中,然后只需要
一個示例就可以了掂恕,然后森林里的每棵樹對這個實例做一次引用:

筆者對游戲開發(fā)不太了解拖陆,這里只是打個比方,關(guān)于具體內(nèi)容
可參看原文:http://gameprogrammingpatterns.com/flyweight.html
想引出:當(dāng)存在多個相同對象的時候懊亡,使用享元模式可以減少相同對象
創(chuàng)建引起的內(nèi)存消耗依啰,提高程序性能。

這里舉個撲克牌的例子來幫助理解享元模式店枣。
(這里假定沒有大小王孔飒,只有52張牌灌闺,四種花色)


普通套路實現(xiàn)撲克牌程序

如果讓你來實現(xiàn)一個簡單的撲克牌程序,你的代碼可能是這樣:

牌有花色和大小坏瞄,先創(chuàng)建一個牌類

然后初始化52張牌桂对,然后隨機(jī)發(fā)五張牌

輸出結(jié)果:

好的,正常輸出鸠匀,但是卻初始化了52個Card對象蕉斜,真的有必要
創(chuàng)建那么多對象嗎?如果使用享元模式需要創(chuàng)建幾個對象缀棍?
我們來寫下代碼對比下宅此!


享元模式實現(xiàn)撲克牌程序

抽取下牌共有的屬性是:花色和大小,花色固定四種爬范,不同是大小父腕,
這里涉及到享元模式的內(nèi)部狀態(tài)和外部狀態(tài),這個等下講青瀑。
寫一個卡牌的父類璧亮,然后寫四個花色的類繼承父類

接著是最關(guān)鍵的享元工廠,創(chuàng)建并管理共享的享元對象斥难,并提供訪問享元對象的接口:

接著客戶端調(diào)用枝嘶,模擬發(fā)十張牌

輸出結(jié)果:

好的,享元模式就是那么簡單哑诊,接下來說下概念性的東西~


享元模式概念相關(guān)

概念定義

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

內(nèi)部狀態(tài)與外部狀態(tài)

內(nèi)部狀態(tài)固定不變可共享的的部分,存儲在享元對象內(nèi)部镀裤,比如這里的花色竞阐。
外部狀態(tài)可變不可共享的部分,一般由客戶端傳入享元對象內(nèi)部暑劝,比如這里的大小骆莹。

三個角色

  • Flyweight享元對象的抽象父類或者接口,通過這個接口铃岔,享元對象可以接受并作用于外部狀態(tài)汪疮;
  • ConcreteFlyweight具體享元實現(xiàn)對象,繼承或?qū)崿F(xiàn)Flyweight并為內(nèi)部狀態(tài)增加存儲空間毁习。
  • FlyweightFactory享元工廠智嚷,創(chuàng)建并管理共享的享元對象,并對外提供訪問共享享元對象的接口纺且。

UML類圖

使用場景

  • 1.系統(tǒng)有大量相同或者相似的對象盏道,消耗大量內(nèi)存
  • 2.需要緩沖池

優(yōu)缺點

  • 優(yōu)點:大大減少對象的創(chuàng)建,降低系統(tǒng)的內(nèi)存载碌,使效率提高
  • 缺點:使得系統(tǒng)變得復(fù)雜猜嘱,需要分離出內(nèi)部狀態(tài)和外部狀態(tài)衅枫,這使得程序的邏輯復(fù)雜化。

本節(jié)代碼

https://github.com/coder-pig/DesignPatternsExample/tree/master/11.Flyweight%20Pattern

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末朗伶,一起剝皮案震驚了整個濱河市弦撩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌论皆,老刑警劉巖益楼,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異点晴,居然都是意外死亡感凤,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門粒督,熙熙樓的掌柜王于貴愁眉苦臉地迎上來陪竿,“玉大人,你說我怎么就攤上這事屠橄∽艴耍” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵仇矾,是天一觀的道長庸蔼。 經(jīng)常有香客問我解总,道長贮匕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任花枫,我火速辦了婚禮刻盐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘劳翰。我一直安慰自己敦锌,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布佳簸。 她就那樣靜靜地躺著乙墙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪生均。 梳的紋絲不亂的頭發(fā)上听想,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機(jī)與錄音马胧,去河邊找鬼汉买。 笑死,一個胖子當(dāng)著我的面吹牛佩脊,可吹牛的內(nèi)容都是我干的蛙粘。 我是一名探鬼主播垫卤,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼出牧!你這毒婦竟也來了穴肘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤舔痕,失蹤者是張志新(化名)和其女友劉穎梢褐,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赵讯,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡盈咳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了边翼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鱼响。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖组底,靈堂內(nèi)的尸體忽然破棺而出丈积,到底是詐尸還是另有隱情,我是刑警寧澤债鸡,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布江滨,位于F島的核電站,受9級特大地震影響厌均,放射性物質(zhì)發(fā)生泄漏唬滑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一棺弊、第九天 我趴在偏房一處隱蔽的房頂上張望晶密。 院中可真熱鬧,春花似錦模她、人聲如沸稻艰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尊勿。三九已至,卻和暖如春畜侦,著一層夾襖步出監(jiān)牢的瞬間元扔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工夏伊, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留摇展,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像咏连,于是被迫代替她去往敵國和親盯孙。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容