天天看點

Aha!設計模式(66)-享元模式(3)

示例代碼

以下為享元模式的Python語言實作,代碼為作者本人提供。如果稍加調查,應該可以發現其他的實作方式,但本文中的代碼以盡量靠近《設計模式》的方式提供,首先是Flyweight相關類:

Aha!設計模式(66)-享元模式(3)

Flyweight主要是定義了一個适用外部狀态的operation方法,接下來ConcreteFlyweight具體實作了這個方法,代碼中将外部狀态疊加在對象的輸出上;另外一個UnsharedConcreteFlyweight是非共享具象類,它的輸出隻輸出對象自身的狀态。

如果隻到這一步的話,和享元并沒有太大的關系,接下來是關鍵:

Aha!設計模式(66)-享元模式(3)

一個對象是否在使用者之間共享是由FlyweightFactory決定的,對于需要共享的ConcreteFlyweight對象,工廠類維護了一個對象池,如果需要的對象已經存在,則直接傳回該對象。如果需要的對象不存在,則建立一個對象儲存在對象池中以後再傳回;對于不需要功能的UnsharedConcreteFlyweight對象,直接建構新對象并傳回。代碼中直接适用state作為享元對象分類的依據,實際的開發中可以根據需要決定。

以下是适用享元的代碼:

Aha!設計模式(66)-享元模式(3)

代碼中為每個對象賦予了不同的外部狀态。接下來是程式輸出:

Aha!設計模式(66)-享元模式(3)

前兩個輸出來自于同一個對象,但是輸出不同的外部狀态,後面三個輸出分别來自不同的對象。

效果

使用享元模式可以節約不同使用者持有相同資料時造成的記憶體空間浪費,這種對象越多,效果越明顯。但是需要注意的是,管理外部狀态也需要執行時間和記憶體空間的代價,在實際使用的時候需要計算得失之後再決定。

另外一種情況是由于軟體的需求在使用者之間共享對象,這時享元模式可以作為實作方式的一個可選項。當然了,這種情況下效率和空間就不是第一位的因素了。

繼續閱讀