Abstract Factory パターンは、同じテーマを持つ個別のファクトリーのセットをカプセル化する方法を提供する作成パターンです。その本質は、「これらのオブジェクトの特定のクラスを指定せずに、一連の関連または独立したオブジェクトを作成するためのインターフェイスを提供する」ことです。
抽象ファクトリ パターンは、具体的なクラスを指定せずに、システム関連または相互依存するオブジェクトを作成するためのインターフェイスを提供します。
Abstract Factoryパターンの主な役割
Abstract Factoryロール:抽象的なプロダクトオブジェクトを作成するためのインターフェースを宣言します
Concrete Factory(コンクリートファクトリー)ロール:プロダクトオブジェクトを作成する操作を実装します
Abstract Product(抽象プロダクト)ロール: 製品のタイプのインターフェイスを宣言します
具体的な製品のロール: 抽象的な製品のロールによって定義されたインターフェイスを実装します
これは、ファクトリ メソッドのパターンに似ています。ハンバーガーが 1 つだけ必要になるわけではなくなり、おそらく 4 つのハンバーガーと 2 つのチキンが必要になります。翼、私たちはまだウェイターに、ウェイターはコンクリート工場に属しており、抽象的な製品はマクドナルドが販売できる食品であり、特定の製品はウェイターに要求する食品であると伝えました。
適用性
システムがその製品とは独立して作成、組み立て、表現される場合。
複数の製品シリーズのいずれかでシステムを構成する場合。
共同使用する一連の関連製品オブジェクトのデザインを強調する必要があります。
製品クラス ライブラリを提供し、その実装ではなくインターフェイスのみを表示したい。
クラス図
インスタンス
<?php class Button{} class Border{} class MacButton extends Button{} class WinButton extends Button{} class MacBorder extends Border{} class WinBorder extends Border{} interface AbstractFactory { public function CreateButton(); public function CreateBorder(); } class MacFactory implements AbstractFactory{ public function CreateButton(){ return new MacButton(); } public function CreateBorder(){ return new MacBorder(); } } class WinFactory implements AbstractFactory{ public function CreateButton(){ return new WinButton(); } public function CreateBorder(){ return new WinBorder(); } } ?>
この例では、ファクトリ クラスは一連のファクトリ メソッドを実装します。新しい関数を追加する場合は、既存のファクトリ クラスを変更せずに、新しいインターフェイスを追加して、新しいファクトリ クラスにこのインターフェイスを実装させることができます。
長所と短所
長所
特定のカテゴリを分離する
製品ファミリーの追加または置換が簡単になる
製品の一貫性を維持するのに役立つ
短所
新しいタイプの製品をサポートするのが困難です。これは、AbstractFactory インターフェイスによって、作成できる製品のコレクションが決定されるためです。新しいタイプの製品をサポートするには、ファクトリ アクセス インターフェイスを拡張する必要があり、その結果、AbstractFactory クラスとそのすべてのサブクラスが変更されます。