1. 程式人生 > >設計模式之物件池模式(Object Pool)

設計模式之物件池模式(Object Pool)

物件池模式

今天忽然看到一個有趣的設計模式,就上網看了下,現做一個整理。

前期瞭解:Object Pool,即物件池,物件被預先建立並初始化後放入物件池中,物件提供者就能利用已有的物件來處理請求,減少物件頻繁建立所佔用的記憶體空間和初始化時間,例如資料庫連線物件基本上都是建立後就被放入連線池中,後續的查詢請求使用的是連線池中的物件,從而加快了查詢速度。類似被放入物件池中的物件還包括Socket物件、執行緒物件和繪圖物件(GDI物件)等。
  在Object Pool設計模式中,主要有兩個參與者:物件池的管理者和物件池的使用者,使用者從管理者那裡獲取物件,物件池對於使用者來講是透明的,但是使用者必須遵守這些物件的使用規則,使用完物件後必須歸還或者關閉物件,例如資料庫連線物件使用完後必須關閉,否則該物件就會被一直佔用著。
  物件管理者需要維護物件池,包括初始化物件池、擴充物件池的大小、重置歸還物件的狀態等


  物件池在被初始化時,可能只有幾個物件,甚至沒有物件,按需建立物件能節省資源和時間,對於響應時間要求較高的情況,可以預先建立若干個物件。
  當物件池中沒有物件可供使用時,管理者一般需要使用某種策略來擴充物件池,比如將物件池的大小翻倍。另外,在多執行緒的情況下,可以讓請求資源的執行緒等待,直到其他執行緒歸還了佔用的物件。
  一般來說,物件池中的物件在邏輯狀態上是相同的,如果都是無狀態物件(即沒有成員變數的物件),那麼這些物件的管理會方便的多,否則,物件被使用後的狀態重置工作就要由管理者來承擔。


1、意圖

在建立物件比較昂貴,或者對於特定型別能夠建立的物件數目有限制時,管理物件的重用。

2、問題

物件的建立和/或管理必須遵循一組定義明確的規則集。通常這些規則都與如何建立物件、能夠建立多少個物件和在已有物件完成當前任務時如何重用它們等等相關。

3、通用結構

4、解決方案

在需要一個Reusable物件時,Client呼叫ReusablePool的AcquireReusable方法。如果池是空的,那麼AcquireReusable方法建立一個Reusable物件(如果能夠),否則,就等待知道有Reusable物件返回集合。

5、參與者與協作

ReusablePool管理著Client所用的Reusable物件的可用性。Client然後在一個有限的時間段內使用Reusable物件的例項,ReusablePool包含所有Reusable物件,這樣就可以對其以統一的方式進行管理。

6、效果

最適用於對物件的需求一直非常穩定的時候,需求變化太大會帶來效能問題。ObjectPool中為了解決這一問題,限制了能夠建立的物件數量。使管理例項建立的邏輯與例項被管理的類分離,可以得到內聚更好的設計。

7、實現

如果可以建立的物件數量有限制,或者池的大小有限制,可以使用一個簡單的陣列來實現池。否則,使用vector物件,負責管理物件池的物件必須是唯一能夠建立這些物件的物件。ReusablePool是使用Singleton模式實現的。另一種變體是在Reusable物件中加一個釋放方法---讓它自己返回到池。