標(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