程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 無廢話C#設計模式之十:Flyweight(2)

無廢話C#設計模式之十:Flyweight(2)

編輯:關於C語言

代碼執行結果如下圖(前面是使用享元模式的結果,後面是沒有使用享元模式的結果):

代碼說明

l 這裡的ModelFactory就是享元工廠角色。它的作用是創建和管理享元對象。可以看到,每加載一個模型都會在Hashtable中記錄一下,之後如果客戶端還是需要這個模型的話就直接把已有的模型對象返回給客戶端,而不是重新在內存中加載一份模型數據。

l ModelFactory本身應用了Singleton,因為如果實例化多個享元工廠是的話就起不到統一管理和分配享元對象的目的了。

l Model就是享元角色。在構造方法中傳入modelName,然後它從指定路徑加載模型數據,並且把數據放入字段中。

l 從代碼的運行結果中可以看到,如果沒有應用享元模式,那麼在內存中就會有10000套模型對象,由於一共就2個模型,所以9998個對象是可以通過享元來消除的。

何時采用

l 系統中有大量耗費了大量內存的細粒度對象,並且對外界來說這些對沒有任何差別的(或者說經過改造後可以是沒有差別的)。

實現要點

l 享元工廠維護一張享元實例表。

l 享元不可共享的狀態需要在外部維護。

l 按照需求可以對享元角色進行抽象。

注意事項

l 享元模式通常針對細粒度的對象,如果這些對象比較擁有非常多的獨立狀態(不可共享的狀態),或者對象並不是細粒度的,那麼就不適合運用享元模式。維持大量的外蘊狀態不但會使邏輯復雜而且並不能節約資源。

l 享元工廠中維護了享元實例的列表,同樣也需要占用資源,如果享元占用的資源比較小或者享元的實例不是非常多的話(和列表元素數量差不多),那麼就不適合使用享元,關鍵還是在於權衡得失。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved