Object Poolパターン
Object Poolの実装
Object Poolを実際に利用するには、独自に実装する方法もありますが、汎用的に利用できるObject Poolを提供するライブラリが存在します。ここでは、オープンソースのApacheプロジェクトのcommons-poolの実装とその利用方法を紹介します。
commons-poolは、Object Poolを実装するためのインターフェースと標準的な実装クラスのいくつかを用意しています。Object Poolインターフェースは2ページ目の図2(http://thinkit.jp/article/934/2/)のReusableクラスに相当するクラスを実装するためのインターフェースです。commons-poolでは、Object Poolの実装がいくつか用意されていますが、もっとも簡単に利用できる実装として、GenericObjectPoolクラスが提供されています。プールからオブジェクトを取得するためのメソッドがborrowObjectです。プールにオブジェクトを戻すためのメソッドがreturnObjectです。オブジェクトプールの利用を終了してプールにあるオブジェクトをすべて消去するためのメソッドがcloseです。GenericObjectPoolクラスは、Singletonにはなっていませんが、Singletonパターンを適用して、GenericObjectPoolのインスタンスを1つに制限することで、図2の場合と同様なオブジェクトプールにすることも可能です。
commons-poolでは、プールするためのオブジェクトを生成する部分でFactory Methodパターン(*4)も利用しています。PoolableObjectfactoryは、プールするオブジェクトを生成するためのFactoryクラスを実装するためのインターフェースです。commons-poolを利用する場合、PoolableObjectFactoryを実装して、プールするオブジェクトを生成するクラスを作成します。図3では、例としてプールするオブジェクトをPooledObject、PooledObjectを生成するFactoryクラスをPooledObjectFactoryという名称にしてあります。PoolableObjectFactoryのFactoryメソッド(オブジェクトを生成して返すメソッド)は、makeObjectです。そのほかにオブジェクトを利用状態にするactivateObjectメソッド、オブジェクトを利用可能(未使用状態)にするpassivateObjcetメソッド、オブジェクトを消去するためのdestoryObjectメソッドなどが定義されています。
*4:Factory Methodパターン:GoFの23のパターンで紹介されているデザインパターンです。
Object PoolパターンとFactory Methodパターンの組み合わせ
もっともシンプルにCommons-Poolを利用するには、図3において、PooledObjectとPooledObjectFactoryに相当するクラスを作成し、GenericObjectPoolを生成した後にsetFactoryメソッドで、作成したPooledObjectFactoryを渡します。Client、またはborrowObjectメソッドの内部からaddObjectメソッドが呼ばれると、PooledObjectFactoryを利用して、オブジェクトを生成して利用します。Factoryパターンと組み合わせたことで、commons-poosが提供する既存のGenericObject Poolを使って、ユーザーが定義したクラスをオブジェクトプールにすることができます。
このように、Object Poolパターンは、Factory Methodパターンと組み合わせて利用されることで、汎用的に利用できるオブジェクトプールを提供できます。
【参考文献】
アランシャロウェイ、ジェームズ.R.とロット(原著),村上 雅章(翻訳)『オブジェクト指向のこころ』ピアソン・エデュケーション(発行年:2005)
「Apache Commons - commons pool」
http://commons.apache.org/pool/
(アクセス:2009/05)