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