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

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

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

Abstract Factoryとは

Abstract Factoryパターンでは、抽象的な部品を組み合わせて抽象的な製品を作ります。

部品の具体的な実装には注目せず、インタフェース(API)に注目します。このインタフェース(API)だけを使って、部品を組み立て、製品にまとめます。

ここでは、「HTMLのリンク集のHTMLを作成するファクトリ」を実装します。

まず、抽象的な製品を定義します。

Itemクラスは、すべての部品の親となるクラスです。Itemの子クラスは、makeHTML()メソッドを実装することが期待されます。

次に、HTMLのリンクを表す抽象的な部品として、Linkを実装します。

Linkは、captionに加えて、urlの情報を保持できるのが特徴です。

次に、Itemを格納する抽象的なTrayを作ります。

Trayには、Itemを追加していくことができます。Tray自身もItemなので、TrayにTrayを格納することもできます。

次に、HTMLページ全体をまとめたPageクラスを作ります。

Page::makeHTML()を呼ぶと、HTMLが生成されます。Page::output()で、生成したHTMLをファイルに書き込みます。

最後に、抽象的な工場であるFactoryを作ります。

Fuctory::getFactory()に具体的なファクトリークラスの名前を渡すと、そのファクトリークラスが返ります。Factory::createPage()等のメソッドに具体的なHTML生成処理を記述します。

これらのファクトリーは、以下のようなコードで使用することを想定しています。

上記コードでは、コマンドラインから引数を受け取って、Factory::getFactory()で具体的なファクトリークラスを初期化します。
次に、検索エンジンのリンクを格納するTrayを作って、そこに検索エンジンのリンクを追加しています。
最後に、Factory::createPage()で具体的なPageを作成し、PageにTrayを追加し、Page::output()でHTMLを出力しています。
ポイントは、ここで呼び出されているメソッドはすべて抽象クラスに用意されているものだけ、ということです。
このように実装することで、具体的なファクトリーの交換が容易になります。

それでは、これらの処理に対応した具体的なクラスを実装していきましょう。

ここではListFactoryという、リンクをリスト形式に表現するファクトリーを実装します。

ListLink::makeHTML()は、シンプルに、liタグで囲まれたaタグを返します。

ListTray::makeHTML()は、Tray内のリストをひとまとめにします。

ListPage::makeHTML()では、HTML全体を生成します。

最後に、ListFactoryです。ここでは、ListFactoryの具体的な部品を生成して返します。

ここではリストを使ったファクトリーを実装しましたが、テーブルを実装したファクトリーに差し替えることは簡単です。

このように、Abstract Factoryを使うと、様々なオブジェクトが絡んだ処理を、容易に差し替えできるようになります。

コメントを残す