38

これはファクトリパターンについてです。私は少し混乱しています。

createInstance()メソッドが静的である実装と、非静的であるいくつかの実装を見ました。

「スタイル」や「味」に依存していると言う人もいれば、そうではないと言う人もいます。Gang of Fourによると、ウィキペディアは非静的である必要があると述べており、 http://www.dofactory.com/Patterns/PatternFactory.aspxも非静的である必要があると述べています。

私の質問は、それがスタイルと好みに依存するのか、それとも静的な方法で実装された場合にファクトリパターンに違反するのかということです。どうしたの?

4

3 に答える 3

49

私は好みの問題として「インスタンス対静的」を分類することを非常に躊躇しています。この種の意味は、それが好きな色、またはより適切には、キャメルケース対パスカルケースのような美的であることを意味します。

インスタンスと静的は、トレードオフの問題です。インスタンスとインスタンスメンバーがある場合、インターフェイスを実装し、他のクラスから継承できるため、あらゆる種類のインスタンスメンバーを使用すると、ポリモーフィズムのすべての利点を利用できます。静力学では、これらの利点は得られません。一般に、静的とインスタンスは、事前の単純さと下流の単純さのトレードオフです。統計はグローバルにアクセス可能であり、「いつ、誰がインスタンス化する必要があるか」などを考慮する必要がないため、簡単です。アクセサー/ミューテーターまたはコンストラクターを使用してそれらを渡す必要はなく、APIはよりクリーンに見えます。これにより、事前の推論が容易になります。しかし、それはメンテナンスと将来の実装を難しくします。

静的メソッド(たとえば、あなたの場合はファクトリメソッド)があり、後で特定の状況で異なる動作をしたい場合は、一種の悩みの種です。2番目の方法を作成し、機能から変更したいものを除いたものをコピーして貼り付け、クライアントにそれを理解させる必要があります。または、さらに悪いことに、グローバル変数を公開し、メソッドを使用する前後にクライアントにこれを設定させ、グローバルがメソッドの動作方法を指示します。

インスタンスルートを前もって行っていれば、これは簡単です。最初のファクトリメソッドを継承してオーバーライドし、新しい機能が必要な場所に派生クラスを提供するだけです。クライアントコードに追加の負担をかけることはなく、既存のクラスにほとんど変更を加えていません(オープン/クローズド原則)。

私のアドバイスは、将来あなたや他のメンテナに好意を示し、インスタンスの実装を使用することです。それは、四人組や他の誰かが何を望んでいるか、または好むかという問題ではありません-それは、コードの腐敗に直面したあなた自身の正気の問題です。

于 2011-10-26T20:33:17.620 に答える
22

静的メソッドはパターンに違反しませんが、他の多くのオブジェクト指向の慣行 (制御の反転 + 依存関係の挿入など) に反するため、インスタンスを使用する方が適切です。

編集:

この回答のバッジを手に入れたばかりですが、それを読んだとき、自分の目を信じることができませんでした. GoF Factory メソッドのパターンについて厳密に述べると、それは誤りであり、修正する価値があります。

タイプのインスタンスを作成するための静的CreateInstanceメソッドを使用できます-それについては何も問題はありません-人々はそれをファクトリーメソッドと呼ぶことがよくありますが、それはファクトリーメソッドパターンと呼ばれるものではありません。このメソッドにロジックを入れて、いくつかの条件に応じて異なる型のインスタンスを作成し始めると、GoF で記述された Factory Method パターンが実際に必要になる場合があります。

GoF Factory メソッド パターンのポイントは、内部の条件付きロジックCreateInstanceを継承とポリモーフィズムに置き換えることであり、静的にすることはできません。ファクトリ メソッドはインスタンス メソッドであり、さらに仮想メソッドです。基本タイプには通常、抽象的CreateInstanceで条件付きロジックが継承ツリーに置き換えられ、各サブタイプがオーバーライドさCreateInstanceれ、そのサブタイプに固有の製品のみが作成されます。

于 2011-10-26T20:19:27.740 に答える
7

その場合、abstract factoryインスタンス レベルは正常です。staticまた、インスタンス レベルの機能は、レベルよりもモックや単体テストが容易になる傾向があります。

于 2011-10-26T20:16:35.483 に答える