『Java言語で学ぶデザインパターン入門』をPHPで実習する 第4章Factory Method

増補改訂版Java言語で学ぶデザインパターン入門

本記事に掲載したサンプルコードは、https://github.com/ryo-utsunomiya/design_patternでも公開中です。

Factory Methodとは

Factory Methodとは、インスタンスの作り方の大枠をスーパークラスのFactoryで定め、具体的な肉付けはサブクラスのFactoryで行う、というインスタンス生成のパターンです。Template Methodと似ていますが、インスタンスの生成に特化している点が異なります。

まず、「生成するもの(Factory)」と、「生成されるもの(Product)」を表す、抽象的な枠組み(framework)を作成します。

Factroyには、createというpublicメソッドがあります。このメソッドがProductインスタンスの作成を扱います。

Productは、Factoryによって作られるインスタンスで、useThisというメソッドを持っています(useはPHPでは予約語なので、メソッド名には使えません)。

次に、IDカードを例とした、具体的なFactoryとProductを作成します。

PHPのタイプヒント機能では、「Product $product」と定義した場合、「$productはProductか、Productを継承したクラスであること」という制約になります。

しかし、IDCardFactory::registerProduct()は$productがgetSerialとgetOwnerというメソッドを持つことを期待しているので、実際はProductではなくIDCardを渡して欲しい。registerProductのシグネチャをregisterProduct(IDCard $product)と変えてしまうと親クラスとは異なるシグネチャでのオーバーライドでエラーになるので、Productのタイプヒントは残した上でinstanceofでIDCardであることを確認しています。

Productを継承するIDCardオブジェクトは上のような実装になります。

実行コードは以下のようになります。

コメントを残す