設計模式之享元模式

2021-10-01 12:12:19 字數 3255 閱讀 1012

二、享元模式

三、享元模式解決**展示專案

四、享元模式注意事項和細節

小型的外包專案,給客戶a做乙個產品展示**,客戶a的朋友感覺效果不錯,也希望做這樣的產品展示**,但是要求不同

有客戶要求以新聞的形式發布

有客戶要求以部落格的形式發布

直接複製貼上乙份,然後根據客戶不同要求,進行定製修改

給每個**租用乙個空間

方案設計示意圖

需要的**結構相似度很高,而且都不是高訪問量**,如果分成多個虛擬空間來處理,相當於乙個相同**的例項物件很多,早晨伺服器的資源浪費

對於**來說,由於是乙份例項,維護和擴充套件都更加容易

上面的思路,可以使用享元模式來解決

享元模式(flyweight pattern)也叫蠅量模式:運用共享技術有效的支援大量細粒度物件

常用語系統底層開發,解決系統的效能問題。像資料庫連線池,裡面都是建立好的物件,在這些連線物件中有我們需要的則直接拿來用,避免重新建立,如果沒我們需要的則建立乙個

享元模式能夠解決物件的記憶體浪費的問題,當系統中有大量相似物件,需要緩衝池時。不需總是建立新物件,可以從緩衝池裡拿。這樣可以降低系統記憶體,同時提高效率

享元模式經典的應用場景就是池技術,string常量池,資料庫連線池,緩衝池等等都是享元模式的應用,享元模式是池技術的重要實現方式

flyweight是抽象的享元角色,他是產品的抽象類,同時定義出物件的外部狀態和內部狀態的介面或實現

concreteflyweight是具體的享元角色,是具體的產品類,實現抽象角色定義相關業務

unsharedconcreteflyweight是不可共享的角色,一般不會出現在享元工廠

flyweightfactory享元工廠類,用於構建乙個池容器,同時提供從池中獲取物件方法

比如尾氣,五子棋,跳棋,他們都有大量的棋子物件,圍棋和五子棋只有黑白兩色,跳棋顏色多一點,所有棋子顏色就是棋子的內部狀態;而各個棋子之間的差別就是位置不同,當我們落子後,落子顏色是定的,但位置是變化的,所以棋子座標就是棋子的外部狀態

享元模式提出了兩個要求:細粒度和共享物件。這裡就涉及到內部狀態和外部狀態了,即將物件的資訊分為兩個部分:內部狀態和外部狀態

內部狀態指物件共享出來的資訊,儲存在享元物件內部且不會隨環境的改變而改變外部狀態指物件得以依賴的乙個標記,是隨環境改變而改變的,不可共享的狀態舉個例子:圍棋理論上有361個空位可以放棋子,每盤棋都有可能有兩三百個棋子物件產生,因為記憶體空間有限,一台伺服器很難支援更多的玩家玩圍棋遊戲,如果用享元模式來處理棋子,那麼棋子物件就可以減少到只有兩個例項,這樣就很好的解決了物件開銷問題

* @description : **工廠類 根據需求返回乙個**

*/public

class

websitefactory

return pool.

get(type);}

/** * 獲取**分類的總數 (池中有多少)

*/public

intgetwebsitecount()

}

/**

* @author: lidelin [email protected]

* @date: 2019/11/13

* @description :

*/public

class

client

}

在享元模式這樣理解,享就表示共享,元表示物件

系統中有大量物件,這些物件消耗大量記憶體,並且物件的狀態大部分可以外部化時,我們就可以考慮選用享元模式

用唯一標識碼判斷,如果記憶體中有,則返回這個唯一標識碼所標識的物件,用hashmap/hashtable儲存

享元模式大大減少了物件的建立,降低了程式記憶體的占用,提高效率

享元模式提高了系統的複雜度,需要分離出內部狀態和外部狀態,而外部狀態具有固化特性,不應該隨著內部狀態的改變而改變,這是需要注意的地方

使用享元模式時,注意劃分內部狀態和外部狀態,並且需要乙個工廠類加以控制

享元模式經典的應用場景是需要緩衝池的物件,比如string常量池,資料庫連線池

設計模式之享元模式

1 享元模式運用共享技術有效地支援大量細粒度的物件。uml圖如下 2 思考 flyweight根據客戶需求返回已經生成好的物件,但一定要事先生成物件例項嗎?答 實際上是不一定需要的,完全可以初始化的時候什麼也不做,到需要的時候,再去判斷物件是否為null來決定是否例項化。3 思考 為什麼要有unsh...

設計模式之 享元模式

享元模式英文稱為 flyweight pattern 又譯為羽量級模式或者蠅量級模式。享元模式的定義為 採用乙個共享類來避免大量擁有相同內容的 小類 的開銷。這種開銷中最常見 直觀的影響就是增加了記憶體的損耗。享元模式以共享的方式高效的支援大量的細粒度物件,減少其帶來的開銷。在名字和定義中都體現出了...

設計模式之享元模式

享元模式運用共享技術有效地支援大量細粒度的物件。如果乙個應用程式使用了大量的物件,而大量的這些物件造成了很大的儲存開銷時應該考慮使用。物件的大多數狀態可以是外部狀態,如果刪除物件的外部狀態,那麼可以用相對較少的共享物件取代很多組物件,此時也可以考慮用享元模式。享元模式uml圖如下 如下 使用者 cl...