Abstract Factory は、 生成に関するデザインパターンのひとつで、 具象クラスを指定することなく、 プロダクト (訳注: 本パターンでは、 生成されるモノのことを一般にプロダクトと呼びます) のファミリー全部を生成することを可能とします。
Abstract Factory は、 個々のプロダクト全部を作成するためのインターフェースを定義しますが、 実際のプロダクト作成の作業は、 具象クラスに委ねられます。 ファクトリーの型 (クラス) それぞれは、 特定のプロダクトの異種に対応します。
クライアント・コードは、 コンストラクター呼び出し (new
演算子) で直接プロダクトを作成する代わりにファクトリー・オブジェクトの作成メソッドを呼び出します。 ファクトリーはプロダクトの特定の異種に対応しているため、 すべてのプロダクトには互換性があります。
クライアント・コードは、 その抽象インターフェイスを通じてのみファクトリーやプロダクトとやりとりします。 このため、 クライアント・コードはファクトリー・オブジェクトによって作成された任意のプロダクトの異種と動作します。 プログラマーがやるべきことは、 新しい具象ファクトリー・クラスを作成し、 それをクライアント・コードに渡すことです。
もし各種ファクトリー系のパターンやコンセプトの違いで迷った場合は、 ファクトリーの比較 をご覧ください。
概念的な例
この例は、 Abstract Factory デザインパターンの構造を説明するためのものです。 以下の質問に答えることを目的としています:
- どういうクラスからできているか?
- それぞれのクラスの役割は?
- パターンの要素同士はどう関係しているのか?
ここでパターンの構造を学んだ後だと、 これに続く、 現実世界の PHP でのユースケースが理解しやすくなります。
index.php: 概念的な例
Output.txt: 実行結果
現実的な例
この例では、 Abstract Factory パターンは、 ウェブ・ページの各種の要素に対してさまざまな型のテンプレートを作成するためのインフラストラクチャーを提供します。
ウェブ・アプリケーションは、 異なるレンダリング・エンジンを同時にサポートできます。 しかし、 そのクラスが、 レンダリング・エンジンの具象クラスから独立している場合に限ります。 したがって、 アプリケーションのオブジェクトは、 テンプレート・オブジェクトと、 抽象インターフェースを介してのみ通信する必要があります。 テンプレート・オブジェクトは直接作成するのではなく、 特別なファクトリー・オブジェクトに委任するようにします。 最後に、 あなたのコードはファクトリー・オブジェクトにも依存するべきではありません。 代わりに抽象的ファクトリー・インターフェースを介して作業をします。
その結果、 レンダリング・エンジンのどれか一つに対応するファクトリー・オブジェクトをアプリに渡すことができます。 アプリが作成するすべてのテンプレートは、 そのファクトリーによって作成されたものなので、 その型はファクトリーの型と一致します。 レンダリング・エンジンを変更したい場合は、 新しいファクトリーをクライアント・コードに渡すだけでよく、 既存のコードは問題なく動作します。
index.php: 現実的な例
Output.txt: 実行結果