一周兩個設計模式—設計模式之享元模式(第四周)

      網友投稿 837 2022-05-29

      背景:

      書接上文,自從小犬把天堂咖啡廳的項目做完之后,瞬間在天庭的技術圈是名聲四起,是公認的大牛級人物了,

      昨天又順利牽到玉兔的小手,弄得這只萬年單身汪興奮到了后半夜,今天小犬剛從美夢中醒來接到了一個電話,一看來顯,哪吒三太子,

      該不會是系統出問題了吧,趕緊接聽,原來是天庭職稱考試,哪吒居然報了個技術崗位,于是哪吒最近狂補技術知識,這不昨天看到了

      享元模式,死活理解不了(畢竟三頭六臂,不太理解共享),這不找到技術大牛哮天犬了。

      小犬一聽,享元模式,這個倒不是很難,于是就有了一下的介紹。

      定義:

      如果一個對象實例一經創建就不可變,那么反復創建相同的實例就沒有必要,直接向調用方返回一個共享的實例就行,

      這樣即節省內存,又可以減少創建對象的過程,提高運行速度。共享一個對象。享元模式是池技術的重要實現方式,緩存。

      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 = hashMapOf() fun getFlyWeight(extrinsic:String):Flyweight?{ var flyWeight:Flyweight ?= null if(pool.containsKey(extrinsic)){ flyWeight = pool[extrinsic] Log.v("===========", "已有 $extrinsic 直接從池中取---->") }else{ flyWeight = ConcreteFlyweight(extrinsic) pool[extrinsic] = flyWeight Log.v("===========", "創建 $extrinsic 并從池中取出---->") } return flyWeight } }

      點擊實現:

      var extrinsic = 22 findViewById

      上一篇:分布式搜索服務ElasticSearch(8)
      下一篇:《Office 2019高效辦公三合一從入門到精通 : 視頻自學版》 —3 文檔的排版與美化
      相關文章
      亚洲an天堂an在线观看| 亚洲国产精品无码AAA片| 亚洲第一成年男人的天堂| 中文字幕精品亚洲无线码一区应用| 国产亚洲视频在线| 国产av无码专区亚洲av毛片搜| 亚洲国产精品无码第一区二区三区| 在线观看日本亚洲一区| 亚洲日韩一中文字暮| 亚洲欧洲免费无码| 亚洲av无码专区亚洲av不卡| 亚洲国产精品成人AV在线| 亚洲AV无码一区二区三区网址| 国产亚洲人成在线播放| 国产精品亚洲精品爽爽| 亚洲国产精品嫩草影院久久 | 亚洲五月六月丁香激情| 久久亚洲精品成人无码网站| 亚洲精品福利在线观看| 亚洲男女一区二区三区| 精品久久久久久亚洲精品| 亚洲中文字幕久久久一区| 麻豆亚洲AV成人无码久久精品 | 亚洲国产精品人久久| 亚洲视频在线不卡| 亚洲人成免费网站| 在线亚洲高清揄拍自拍一品区| 亚洲精品第一国产综合亚AV| 国产精品亚洲一区二区无码| 亚洲综合色区在线观看| 精品亚洲永久免费精品| 亚洲高清视频在线播放| 亚洲影视自拍揄拍愉拍| 亚洲av无码偷拍在线观看| 亚洲国产成人久久综合碰| 亚洲韩国精品无码一区二区三区| 亚洲AV日韩AV永久无码绿巨人| 亚洲福利在线视频| 亚洲AV无码一区二区三区人| 亚洲av无码一区二区三区天堂| 亚洲精品视频免费|