天天看點

【HeadFirst 設計模式學習筆記】15 享元模式拾零

我們設想一個問題場景:在一個預約程式中用于表達時間的類Time

在一個程式中可能用到這個類非常多次,而且如果小時和分鐘相同的話,其實這個類産生的記憶體對象是可以共享而不影響功能的。尤其是這個應用場景中,預約的時間往往不是正點就是半點,最多可能是15分、45分這樣的時間,如果能共享記憶體則會明顯省去很多的記憶體對象。

這個共享記憶體的操作是由一個簡單工廠方法提供的,在這個類中維護了一個HashMap,完成了類似記憶體池的功能,若在hashmap中沒有該時間的話就new一個time對象,然後放入其中以便以後維護,若有的話則直接傳回那個對象即可:

最後,我們看一下這個UML圖:

【HeadFirst 設計模式學習筆記】15 享元模式拾零

在這個UML圖中,Flywright做了進一步的抽象,UnsharedConcreteFlyWeight類和ConcreteFlyweight類繼承與Flyweight類(定義了抽象方法Operation),這兩個類的不同點在于FlyweightFactory隻維護了ConcreteFlyweight,而對UnsharedConcreteFlyWeight則不參與。其實UnsharedConcreteFlyWeight并非是享元模式必須的類,放在這裡隻是一個抽象的需要,它的建立就是使用普通的new操作。

繼續閱讀