三分鐘理解「享元模式」 設計模式輕鬆掌握

2021-07-04 22:11:47 字數 1240 閱讀 1585

享原模式的官方定義:

運用共享技術有效地支援大量細粒度的物件。

大白話講:

乙個類它可能生成好多物件,但這些物件根據屬性值的不同一共分成n類,每種型別中屬性值都是一樣的。在這種情況下,如果建立好多物件,那麼這些物件中很多屬性值都是重複的,從而造成了大量的記憶體浪費。

而享元模式能夠解決重複物件的記憶體浪費的問題。

享元模式使用乙個工廠類,在工廠類中為每種型別建立乙個物件,而且每種型別的物件只有乙個。

當客戶端需要某種型別的物件的時候,工廠將已建立好的物件給客戶端。由於不建立新的物件了,所以節省了記憶體。

享元模式的類圖:

客戶端通過factory.getflyweight(key)來獲取指定型別的flyweight物件。

但這樣有乙個問題,有時候指定型別的物件中的某幾個屬性值可能不同,如果通過工廠獲得的物件,由於他們都是統一個物件,因此他們的屬性值都是完全一樣的,這時就需要將屬性值不一樣的屬性存在外部物件中,外部物件作為引數傳遞給flyweight的函式,這些函式在執行過程中當遇到特殊屬性的時候就會呼叫外部物件中的值。類圖如下:

這裡的user就是用於儲存特殊值的外部類,在flyweight類中需要用到屬性特殊值的函式都需要將含有特殊屬性值的外部類物件作為引數傳遞進來。

外部狀態與內部狀態:

在享元物件中,不會隨環境變化而變化的共享屬性稱為享元的內部狀態;

而隨著環境變化而變化的,不可以共享的狀態就是享元的外部狀態。

何時使用?

享元模式可以避免大量非常相似的物件的開銷。

在程式設計中,如果發現需要大量細粒度的類物件來表示資料,而且這些類除了幾個引數不同以外,其他的屬性都是相同的,這時候就可以使用享元模式。類中相同的屬性可以通過工廠類來共享,這些屬性就是享元類的內部狀態;而那些會變化的屬性放在新建的外部物件中,作為引數傳遞給享元類的函式。

享元模式的優點:

享元模式通過共享物件的方式,把所有物件的公共屬性存放在同乙個物件中,不同的屬性存放在外部類中,從而起到了節省儲存空間的作用。

三分鐘理解「簡單工廠模式」 設計模式輕鬆掌握

實際問題 由於超市隔三差五就要辦 活動,但每次 活動的方式不一樣,所以需要開發乙個軟體,營業員只要輸入原價再選擇活動型別後,就能計算出折扣以後的價錢。普通人的做法 mian 這樣寫會有幾個問題 1.若現在增加新的打折方式,就要修改這段 這就打破了 開放 封閉 的原則。2.這段 不易復用。當這個收銀系...

三分鐘理解Python lambda

這篇主要是複習一下 lambda表示式是一種匿名函式,對應python中的自定義函式def。定義func函式,計算給定數x的平方 def func x return x x 等價於 func lambda x x x 用法,他就是乙個函式,像正常函式那樣呼叫就好 func 6 可以看到,lambda...

《三分鐘理解大小端》

無論筆試還是面試都有一定機率問怎麼判斷大小端,那麼你就很自豪的回答,大端就是資料高位元組放在低位址上,小端就是資料低位元組放在低位址上。好了您回答了這個恭喜下面讓你 實現一下,這個時候很多只是死記硬背的缺陷就會暴露出來。其實 的實現很多方法都是可以的,下面舉例最簡單的一種,就是初始化乙個16進製制的...