PHPパターン設計のファクトリーパターン
前回の記事 に続き、PHPパターン設計のシングルトンパターン(あまり関係なさそうですが)。今日は基本パターンの2つ目、デザインファクトリーパターンについてお話します。
では、ファクトリーモードとは何ですか?
名前から判断すると、何の手がかりもなさそうです。ファクトリーモード、生産に関連していますか?それとも製造過程に関係があるのでしょうか?それはまだ工場のリーダーと関係がある可能性がありますか?それはリーダー秘書と関係がありますか?長官…わかりました、あまり近づかないようにしましょう。いわゆる工場モデルは実際には生産に関連しています。何を生産するか?生成されるのはインスタンス オブジェクトです。製造にはどのような設備が使用されますか? ファクトリークラスを通じて生成されます。どうやって生産するのでしょうか? ファクトリ クラスは、独自の静的メソッドを呼び出してオブジェクト インスタンスを生成します。
ファクトリ パターンには、一般原則に従って Factory という名前の静的メソッドであるキー構造があります。ただし、ファクトリ メソッドに名前を付けることはできますが、これは単なる原則です。この静的メソッドは任意のデータ パラメーターを受け入れ、オブジェクトを返す必要があります。
なぜファクトリーモードを使用するのですか?
ファクトリ パターンに触れたことのない多くの人は、なぜオブジェクトを作成するためのファクトリ クラスの構築にこれほど多くの労力を費やさなければならないのか、疑問に思わずにはいられません。メンテナンスの容易さや拡張性などを適用する代わりに、このような単純な問題を考慮することができます。プロジェクト内の場合は、クラスを通じてオブジェクトを作成します。ほぼ完成している、または完成していて関数を拡張する必要がある場合、元のクラス名があまり適切ではないことが判明したり、関数拡張を実現するにはクラスにコンストラクター パラメーターを追加する必要があることがわかります。なんてことだ!このクラスを通じて多数のオブジェクト インスタンスを作成しましたが、それらを 1 つずつ変更する必要がありますか?今になって初めて「高凝集性・低結合性」の広さと深さを感じます。問題ありません。ファクトリ メソッドでこの問題は解決できます。
もう一度考えてみましょう。データベースに接続したいのですが、php には、mysql 拡張機能、mysqli 拡張機能、PDO 拡張機能など、いくつかのメソッドがあります。将来の操作のためのオブジェクトが必要なだけです。どれが必要かは状況によって異なります。全員がデータベースに接続しているため、接続の確立、クエリ、切断などの同じ機能が必要です (インターフェイスの重要性はここで示されています)。全体として、これらの方法は「統一され、外部の世界に対して統一される」必要があります。これを達成するにはどうすればよいでしょうか?工場出荷時のパターンを活用してください。
ファクトリーパターンを実装するにはどうすればよいですか?
シングルトン モードと比較して、上記、ファクトリ クラス、およびファクトリ クラスの静的メソッドについて十分な情報が提供されています。静的メソッドで作成する必要があるオブジェクト インスタンスを新規作成するだけです。もちろん、上記の 2 番目の質問については、ファクトリ クラスの静的メソッドのパラメータに基づいて単純に判断できます。 if..else.. を使用するか switch..case.. を使用するかに関係なく、作成するクラスを決定する作業を迅速かつ効率的に完了できると便利です。最後に、ファクトリ クラスの静的メソッドはオブジェクトを返すことを忘れないでください。 2つどころか3つもありません。
基本的なファクトリ クラス:
<span style="color: #008000;">//</span><span style="color: #008000;">要创建对象实例的类</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> MyObject{ } </span><span style="color: #008000;">//</span><span style="color: #008000;">工厂类</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> MyFactory{</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> factory(){</span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">new</span> MyObject():<span style="color: #000000;"> }} </span><span style="color: #800080;">$instance</span>=MyFactory::factory();
少し複雑なファクトリ パターン:
<?<span style="color: #000000;">php</span><span style="color: #0000ff;">interface</span><span style="color: #000000;"> Transport{ </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> go();}</span><span style="color: #0000ff;">class</span> Bus <span style="color: #0000ff;">implements</span><span style="color: #000000;"> Transport{ </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> go(){ </span><span style="color: #0000ff;">echo</span> "bus每一站都要停"<span style="color: #000000;">; }}</span><span style="color: #0000ff;">class</span> Car <span style="color: #0000ff;">implements</span><span style="color: #000000;"> Transport{ </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> go(){ </span><span style="color: #0000ff;">echo</span> "car跑的飞快"<span style="color: #000000;">; }}</span><span style="color: #0000ff;">class</span> Bike <span style="color: #0000ff;">implements</span><span style="color: #000000;"> Transport{ </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> go(){ </span><span style="color: #0000ff;">echo</span> "bike比较慢"<span style="color: #000000;">; }}</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> transFactory{ </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">function</span> factory(<span style="color: #800080;">$transport</span><span style="color: #000000;">) { </span><span style="color: #0000ff;">switch</span> (<span style="color: #800080;">$transport</span><span style="color: #000000;">) { </span><span style="color: #0000ff;">case</span> 'bus': <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> Bus(); </span><span style="color: #0000ff;">break</span><span style="color: #000000;">; </span><span style="color: #0000ff;">case</span> 'car': <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> Car(); </span><span style="color: #0000ff;">break</span><span style="color: #000000;">; </span><span style="color: #0000ff;">case</span> 'bike': <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> Bike(); </span><span style="color: #0000ff;">break</span><span style="color: #000000;">; } }}</span><span style="color: #800080;">$transport</span>=transFactory::factory('car'<span style="color: #000000;">);</span><span style="color: #800080;">$transport</span>->go();
ファクトリの静的メソッドを Factory() にする必要がある場合、ファクトリ クラスに Factory という愚かな名前を付けないでください。なぜ?同じ名前のコンストラクターを忘れないでください~
最後に、いくつかの感情について話しましょう。彼らは、if..else.. を学んだばかりです。セッションとクッキーを少し上品にしましょう。人々と話していると、拡張性や保守性などについてよく話されます。たとえば、あなたはしばらく言葉を失うでしょう。コードを書くときも、誰かと一緒に勉強するときも、自分は常に「大勢の中で他人を探す」段階にいると感じることがあります。一生懸命勉強した後、ふと振り返ると、「あの人はぼんやりしている」と気づきます。 「光」と叫び、「この人は...」と叫びます。「それはただの***です。」
私もまだ 1 年も経っていない初心者なので、それについて詳しく知りたいと思っています。それが他の人を助けることができれば、それはさらに良いです~~~
シリーズ記事:
php pattern designのシングルトンモード
php pattern Design Factoryパターン