天天看點

Structual設計--Flyweight模式

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

有些應用程式得意于在其整個設計過程中採用對象技術,但簡單化的實作代價極大。如我們在使用word的時候。假設設定正文字型為:text.setFont(new Font(“細明體”, Style.BOLD, 12));每一個文字我們都須要這樣設定,記憶體太大。并且也非常難記,稍有不注意就會出錯。是以通常并非對每一個字元都用一個單獨的對象去表示。

Flyweight模式描寫叙述了怎樣共享對象。是的能夠細粒度地使用他們而無需高昂的代價。

Flyweight模式的有效性非常大程度上取決于怎樣使用它以及在何處使用它。當下面情況都成立時使用Flyweight模式:

一個應用程式使用了大量的對象

全然因為大量的對象,造成非常大的存儲開銷

對象的大多數狀态都可變為外部狀态。

假設删除對象的外部狀态,那麼能夠用相對較少的共享對象代替非常多組對象。

應用程式不依賴于對象辨別。因為Flyweight對象能夠被共享,對于概念上明顯有别的對象,辨別測試将傳回真值。

享元模式的主要目的是實作對象的共享,即共享池,當系統中對象多的時候能夠降低記憶體的開銷。通常與工廠模式一起使用。

Structual設計--Flyweight模式

FlyWeightFactory負責建立和管理享元單元,當一個client請求時。工廠須要檢查目前對象池中是否有符合條件的對象,假設有。就傳回已經存在的對象。假設沒有,則建立一個新對象,FlyWeight是超類。

一提到共享池,我們非常easy聯想到Java裡面的JDBC連接配接池,想想每一個連接配接的特點。我們不難總結出:适用于作共享的一些個對象。他們有一些共同擁有的屬性,就拿資料庫連接配接池來說。url、driverClassName、username、password及dbname。這些屬性對于每一個連接配接來說都是一樣的。是以就适合用享元模式來處理,建一個工廠類,将上述相似屬性作為内部資料,其他的作為外部資料。在方法調用時,當做參數傳進來,這樣就節省了空間。降低了執行個體的數量。

看個樣例:

Structual設計--Flyweight模式

看下資料庫連接配接池的代碼:

通過連接配接池的管理。實作了資料庫連接配接的共享,不須要每一次都又一次建立連接配接,節省了資料庫又一次建立的開銷。提升了系統的性能。

Flyweight模式通常和Composite模式結合起來。用共享葉結點的有向無環圖實作一個邏輯上的層次結構。

通常。最好用Flyweight實作State和Strategy對象。