一周兩個設計模式—設計模式之享元模式(第四周)
背景:
書接上文,自從小犬把天堂咖啡廳的項目做完之后,瞬間在天庭的技術圈是名聲四起,是公認的大牛級人物了,
昨天又順利牽到玉兔的小手,弄得這只萬年單身汪興奮到了后半夜,今天小犬剛從美夢中醒來接到了一個電話,一看來顯,哪吒三太子,
該不會是系統出問題了吧,趕緊接聽,原來是天庭職稱考試,哪吒居然報了個技術崗位,于是哪吒最近狂補技術知識,這不昨天看到了
享元模式,死活理解不了(畢竟三頭六臂,不太理解共享),這不找到技術大牛哮天犬了。
小犬一聽,享元模式,這個倒不是很難,于是就有了一下的介紹。
定義:
如果一個對象實例一經創建就不可變,那么反復創建相同的實例就沒有必要,直接向調用方返回一個共享的實例就行,
這樣即節省內存,又可以減少創建對象的過程,提高運行速度。共享一個對象。享元模式是池技術的重要實現方式,緩存。
UML圖:(網上找的)
Flyweight是抽象享元角色。它是產品的抽象類,同時定義出對象的外部狀態和內部狀態的接口或實現;
內在狀態:不隨環境的變化而變化,上面例子中不管位置如何變化,A就是A。字母A就是內在狀態。
外在狀態:會隨著環境的變化而變化,上面例子中位置變化所以輸出的位置也是不一致的。字母A的位置就是外在狀態
ConcreteFlyweight是具體享元角色,是具體的產品類,實現抽象角色定義的業務;
UnsharedConcreteFlyweight是不可共享的享元角色,一般不會出現在享元工廠中;
FlyweightFactory是享元工廠,它用于構造一個池容器,同時提供從池中獲得對象的方法。
案例圖:
享元工廠角色:這個角色主要負責創建和管理享元角色。判斷是否存在符合要求的享元對象,如果存在則直接拿取,如果不存在的話就會創建一個享元對象并保存。 抽象享元角色:這個角色是所有享元角色的基類。提供需要實現的公共接口 具體享元角色:繼承于抽象享元角色。實現其抽象的接口。 客戶端:負責調用并處理邏輯,且保存多有享元對象的狀態
代碼如下:
Flyweight抽象類
abstract class Flyweight(extrinsic:String) { //內部狀態 lateinit var intrinsic:String //外部狀態,享元角色必須受外部狀態 protected val extrinsic = extrinsic /** * 定義業務操作 */ abstract fun operate(extrinsic:Int) }
繼承Flyweight超類或實現Flyweight接口,并為其內部狀態增加存儲空間
class ConcreteFlyweight(extrinsic:String):Flyweight(extrinsic) { override fun operate(extrinsic: Int) { Log.v("===========","具體Flyweight:$extrinsic") } }
指那些不需要共享的Flyweight子類
class UnsharedConcreteFlyweight(extrinsic:String):Flyweight(extrinsic) { override fun operate(extrinsic: Int) { Log.v("=========","不共享的具體Flyweight:$extrinsic") } }
一個享元工廠,用來創建并管理Flyweight對象,主要是用來確保合理地共享Flyweight,當用戶請求一個Flyweight時,
FlyweightFactory對象提供一個已創建的實例或創建一個實例。
object FlyweightFactory { var pool:HashMap
點擊實現:
var extrinsic = 22 findViewById
運行結果:
Java
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。