最近、PHP の詳細な本のこの部分を 2 回読みましたが、まだ混乱していたので、Du Niang に次のようなブログ投稿があったと思います。これは非常に理にかなっています:
ファクトリーメソッド
ファクトリ メソッドは、製品ごとにファクトリ クラスを提供します。異なる製品インスタンスは、異なるファクトリ インスタンスを通じて作成されます。
同じ階層構造内に、任意の製品を追加できます。
抽象ファクトリー
抽象的な工場は製品ファミリーの概念に対応します。たとえば、各自動車会社は乗用車、トラック、バスを同時に生産したいと考えているため、各工場には乗用車、トラック、バスを作成する方法が必要です。
製品ファミリーの概念に応じて誕生したため、新しい製品ラインを追加することは簡単ですが、新しい製品を追加することは不可能です。
詳しくはブログ記事をご覧ください
つまり、ファクトリメソッドは同じレベルの異なる製品を生産することであり、抽象ファクトリーは異なる製品ファミリーを生産することであり、ファクトリメソッドは抽象ファクトリーでよく使用されます。
まずはファクトリーメソッドをご紹介します。
Appointment オブジェクトを管理する必要がある人事管理プロジェクトがあり、予定について通信するために BloggsCal または MegaCal 形式を使用する必要があるとします。もちろん、時間の経過とともに、必要な形式は確実に増加します。 (私の意見では、ここでのフォーマットはファクトリーモードの製品と同等です)
インターフェイス レベルでは 2 つのクラスを定義できます。 1 つは、Appointment オブジェクトを独自の形式に変換し、それに AppEncoder クラス (製品プロダクト) という名前を付ける必要があります。もう 1 つは、管理者がこのエンコーダーを CommsManager クラス (クリエーター) に名前を付ける必要があります。
次にコードに進みます:
<code><span>abstract</span><span><span>class</span><span>ApptEncoder</span>{</span><span>abstract</span><span><span>function</span><span>encode</span><span>()</span>;</span> } <span><span>class</span><span>BloggsApptEncoder</span><span>extends</span><span>ApptEncoder</span>{</span><span><span>function</span><span>encode</span><span>()</span>{</span><span>return</span><span>"Appointment data encode in BloggsCal format \n"</span>; } } <span>abstract</span><span><span>class</span><span>CommsManager</span>{</span><span>abstract</span><span><span>function</span><span>getHeadText</span><span>()</span>;</span><span>abstract</span><span><span>function</span><span>getApptEncoder</span><span>()</span>;</span><span>abstract</span><span><span>function</span><span>getFooterText</span><span>()</span>;</span> } <span><span>class</span><span>BloggsCommsManager</span><span>extends</span><span>CommsManager</span>{</span><span><span>function</span><span>getHeadText</span><span>()</span>{</span><span>return</span><span>"BloggsCal header\n"</span>; } <span><span>function</span><span>getApptEncoder</span><span>()</span>{</span><span>return</span><span>new</span> BloggsApptEncoder(); } <span><span>function</span><span>getFooterText</span><span>()</span>{</span><span>return</span><span>"BloggsCal footer \n"</span>; } }</code>
ここでは BloggsCal 形式のみを記述しました。これは、MegaCal などの他の形式を追加する場合は、ApptEncoder クラスと CommsManager クラスを継承するだけです。工場の方法。
しかし、このパターンは特殊な種類のコードの重複を形成し、不必要なインスタンス化につながる可能性があることがわかりましたか。そのため、ファクトリ パターンを使用する前に慎重に検討する必要があります
以下では、抽象ファクトリを紹介します
前述したように、ファクトリ パターンはさまざまな製品を生成するために使用され、抽象ファクトリはさまざまな製品ファミリーを生成するために使用されます。前の例を続けてみましょう。
この時点で、プロジェクトには Appointment 関数が 1 つしかありません。これに、Ttd (ToDo 項目) と Contact (連絡先) 関数を追加する必要があります。これを保存するためのクラス図を作成します。コードを書いてみたところ、より明確になりました。
以上、PHP のファクトリ パターンと抽象ファクトリについて、関連する内容も含めて紹介しました。PHP チュートリアルに興味のある友人に役立つことを願っています。