オブジェクト指向の手本、デザインパターン
FactoryMethodパターン サンプルコードUML
UML(図3)をご覧ください。四角で囲まれた部分が1つのクラスを表しています。白い三角形で継承関係を示しています。また、斜字体のクラスは、それ自身インスタンスを作ることができない抽象クラスです。
まず、作成者クラスについて。作成者は斜字体で表現、これは抽象化されているクラスを意味します。すし職人クラス、ケーキ職人クラスは作成者クラスの具象クラスとなります。
作成者クラスは抽象化しておき、必要なメソッドをまとめます。すし職人、ケーキ職人といった具象クラスは、作成者のサブクラスとなります。
生成物クラスも同様に抽象化しておき、具象生成物(生成物_おすし、生成物_ケーキ)で必要となるメソッド・プロパティなどを事前に決定しておきます。
サブクラスにインスタンスを委ねるのがポイント
ここでポイントとなるのは、具象生成者(すし職人、ケーキ職人)のFactoryMethod()というメソッドです。ここで、生成物のインスタンスを生成します。
FactoryMethodは作成者とその生成物のクラスが存在し、それぞれ作成者で生成する生成物は、具象生成者(すし職人、ケーキ職人)ここではすし職人、ケーキ職人に作成すべきインスタンス生成を委ねます。オブジェクトを生成するためには、そのオブジェクトの型を知っている必要があります。
サンプルのFactoryMethodでは、製品を生成するのは作成者の派生クラスの役割です。上記の場合、すし職人は、すしのクラスを生成し、ケーキ職人はケーキのクラスを生成します。すし職人がケーキを生成するというような、誤ったインスタンスを生成することはありません。
作成者クラスの数が多い場合など、作成者だけで作成されるもの(生成物)がわかることは、プログラミング上非常に有効になってきます。FactoryMethodのメリットは、作成者とその生成物の組み合わせを意識する必要がなくなる、ということではないでしょうか。
本記事のサンプルコードのダウンロードはこちらから:http://thinkit.co.jp/sites/default/files/download/22913_samplecode.zip