元々は『デザイン パターン』という本の中で、多くのデザイン パターンが疎結合の使用を奨励しています。この概念を理解するには、多くの開発者が大規模システムで作業する際に経験する困難な旅について話すのが最善です。 1 つのコードを変更すると問題が発生する可能性があり、システムの他の部分 (これまでまったく関係がないと思われていた部分) で連鎖的な中断が発生する可能性があります。
問題は密結合です。システムの一部の関数とクラスは、システムの他の部分の関数とクラスの動作と構造に大きく依存します。これらのクラスが相互に通信できるようにする一連のパターンが必要ですが、インターロックを避けるためにクラスをしっかりと結び付けることは望ましくありません。
大規模システムでは、多くのコードがいくつかの主要なクラスに依存しています。これらのクラスを変更する必要がある場合、問題が発生する可能性があります。たとえば、ファイルから読み取る User クラスがあるとします。これをデータベースから読み取る別のクラスに変更したいと考えていますが、コードはすべてファイルから読み取る元のクラスを参照しています。このとき、ファクトリーモードを使用すると非常に便利です。
ファクトリ パターンは、オブジェクトを作成する特定のメソッドを持つクラスです。 new を直接使用せずに、ファクトリ クラスを使用してオブジェクトを作成できます。このようにすると、作成されるオブジェクトのタイプを変更する場合は、ファクトリを変更するだけで済みます。このファクトリを使用するすべてのコードは自動的に変更されます。
例 1: ファクトリ クラスのリストを表示します。この方程式のサーバー側は、データベースと、フィードバックの追加、フィードバックのリストの要求、および特定のフィードバックに関連する記事の取得を可能にする一連の PHP ページの 2 つの部分で構成されます。
interface IUser { function getName(); } class User implements IUser { public function __construct( $id ) { } public function getName() { return "Jack"; } } class UserFactory { public static function Create( $id ) { return new User( $id ); } } $uo = UserFactory::Create( 1 ); echo( $uo->getName()."\n" ); ?>
IUser インターフェイスは、ユーザー オブジェクトが実行する必要がある操作を定義します。 IUser の実装は User と呼ばれ、UserFactory ファクトリ クラスが IUser オブジェクトを作成します。この関係は、図 1 の UML で表すことができます。
図 1. ファクトリ クラスとそれに関連する IUser インターフェイスとユーザー クラス
このコードを php インタープリターを使用してコマンド ラインで実行すると、次の結果が得られます:
% php factory1.php Jack %
テスト コードは、ファクトリからユーザー オブジェクトを取得し、 getName メソッドの結果を出力します。
ファクトリーメソッドを使用するファクトリーパターンのバリエーションがあります。クラス内のこれらのパブリック静的メソッドは、その型のオブジェクトを構築します。このメソッドは、このタイプのオブジェクトを作成することが重要な場合に役立ちます。たとえば、最初にオブジェクトを作成し、次にいくつかのプロパティを設定する必要があるとします。このバージョンのファクトリ パターンはプロセスを 1 か所にカプセル化するため、複雑な初期化コードをコピーしてコード ベース全体に貼り付ける必要がありません。
例 2 は、ファクトリ メソッドの使用例を示しています。
interface IUser { function getName(); } class User implements IUser { public static function Load( $id ) { return new User( $id ); } public static function Create( ) { return new User( null ); } public function __construct( $id ) { } public function getName() { return "Jack"; } } $uo = User::Load( 1 ); echo( $uo->getName()."\n" ); ?>
このコードははるかに単純です。インターフェイス IUser が 1 つと、このインターフェイスを実装する User クラスが 1 つだけあります。 User クラスには、オブジェクトを作成するための 2 つの静的メソッドがあります。この関係は、図 2 の UML で表すことができます。
図 2. ファクトリ メソッドを使用した IUser インターフェイスとユーザー クラス
コマンド ラインでスクリプトを実行すると、以下に示すように、リスト 1 と同じ結果が生成されます。より小規模な環境でも。ただし、あらゆる規模のプロジェクトに適用できる、この堅実なコーディング形式を学ぶことが最善です。
PHP デザインパターンのファクトリーパターンに関連するその他の記事については、PHP 中国語 Web サイトに注目してください。