python 享元模式 大話設計模式之享元模式

2021-10-11 01:25:14 字數 1068 閱讀 2133

享元模式可以避免大量的非常相似的類的開銷。在程式設計中,有時需要生成大量的細顆粒度的類例項來表示資料,如果能發現這些例項除了幾個引數外基本上都是相同的,如果能把那些引數移到類的例項的外面,在方法呼叫時將他們傳遞進來,就可以通過共享大幅度地減少單個例項的數目。

也就是說,享元模式執行時所需要的狀態是有內部的,也可能有外部的,內部狀態儲存於對於享元物件的具體類中,而外部物件則應該考慮有客戶端物件儲存或者計算,當呼叫享元物件操作時,將該狀態傳遞給它。

如果在乙個應用程式中使用了大量的物件,而大量的這些物件造成了很大的儲存開銷時就應該考慮使用這個模式。還有就是物件的大多說狀態可以是外部,如果刪除物件的外部狀態,那麼可以用相對較少的享元物件取代很多組的物件,此時可以考慮使用享元模式。比如在休閒遊戲開發中,像圍棋、五子棋、跳棋等,他們都有大量的棋子物件,像圍棋和五子棋只有黑白兩色,跳棋顏色略多一些,不過數量也可以接受,所以顏色應該是棋子的內狀態,而各個棋子之間的差別主要在於位置的不同,所謂方位應該起棋子的外部狀態。

下圖是享元模式的結構圖:

2. 具體享元類,它繼承與享元類而實現其介面,並為內部狀態增加儲存空間:

3. 不需要共享的享元子類,這樣它才能使flyweight介面共享成為可能,但它並不是強制共享。

4. flyweightfactory,是乙個享元工廠,用來建立並管理flyweight物件,它主要是用來確保合理的共享flyweight,當使用者請求乙個flyweight時,flyweightfactory物件提供乙個已建立的例項或者建立乙個。

這個模式主要體現在factory_flyweight工廠類的函式 get_fly_weight,它首先判斷在工廠中使用有共享的單元,如果有的就直接返回這個例項;如果沒有的話,就建立乙個需求的例項並返回。

5. 客戶端的**如示:

使用for迴圈產生10個例項,在客戶程式中實現外部的變化,如command每次減去3,依據需要得到的type不同,僅僅需要例項化3次享元的例項。

執行的結果如示:

可以看出,對於享元具體類在工廠中僅僅例化了3個,而外部類有10個。

最後是書中介紹的做乙個使用享元模式的例子,當然也是非常的簡單,具體也就不再解釋了,僅供娛樂liao~

執行的結果:

大話設計模式 享元模式

享元模式可以避免大量非常相似類的開銷。在程式設計中,有時需要生成大量細粒度的類例項來表示資料。如果能發現這些例項除了幾個引數外基本上都是相同的,有時就能夠大幅度地減少需要例項化的類的數量。如果能把那些引數移到類例項的外面,在方法呼叫時將他們傳遞進來,就可以通過共享大幅度地減少單個例項的數目。所有具體...

《大話設計模式 享元模式》筆記

1 享元模式 flyweight 運用共享技術有效的支援大量細顆粒度的物件。2 享元模式結構圖 3 簡單 實現 flyweight類,它是所有享元類的超類或介面,通過這個介面,flyweight可以接受並作用於外部狀態。public abstract class flyweightconcretef...

java 享元模式(大話設計模式)

所有具體享元類的超類,接受並作用於外部狀態 author administrator public abstract class flyweight class concreteflyweight extends flyweight class unsharedconcreteflyweight e...