すべての最初に、ファクトリメソッドパターンの意図を確認してみましょう:
オブジェクトを作成するためのインターフェイスを定義しますが、サブクラスがインスタンス化するクラスを を決めましょう。ファクトリメソッドは、クラスがサブクラスに対して のインスタンスを延期することを可能にします。
問題に該当しますか?クエリを管理する方法について、ドメインオブジェクトの作成よりも心配しています。
IMHO、私は静的なクラス/メソッドを含む実装の代替方法を避けます: 静的なクラスから継承することはできませんので、モデルの拡張性を制限しています。非静的クラスの静的メソッドも同じです。サブクラスではオーバーライドできません。
これらのクエリメソッドをドメインオブジェクトに追加することはありません。現実の世界をモデル化するためにOOPを使用していることを覚えておいてください。注文を他の注文を検索するように求めるのは意味がありますか?
実際のところ、特定の情報(日付、顧客の名前または製品)を取得するために注文を使用します。注文を探したいときは、どこに保管してもそれを探す(ファイルキャビネットなど)。つまり、他の注文を検索するために注文を使用しません。
これを念頭において、この状況をソフトウェアでモデル化する必要があります。あなたはすでに注文と製品をモデル化したオブジェクトを持っています。あなたが欠けているのは、注文を保存して検索するために使用する場所をモデル化するオブジェクトです。
一般に、これらの種類のオブジェクト(他のオブジェクトを保存または取得する)はリポジトリと呼ばれます。あなたの場合は、ClientOrderRepositoryという名前にすることができます。 このオブジェクトは何をしますか?さて、すでに言及しました。あなたが必要とする4つの異なるクエリを実行します。のは、そのインターフェイスのための可能な定義を見てみましょう:
public interface IClientOrderRepository {
ClientOrder FindOrderWithIdMatching(int anOrderId);
ClientOrder FindOrderWithClientNameMatching(string aClientName);
ClientOrder FindOrderWithProductNameMatching(string aProductName);
ClientOrder FindOrderWithProductIdMatching(string aProductId);
}
あなたはシングルトンパターンを使用することができ、このインタフェースを実装するクラスのインスタンスを1つだけ持っている必要がある場合。後で変更することが困難な実装の選択肢(静的メソッドのようなもの)に頼らないでください。
最後に、問題を解決する特定のパターンが見つかったとしても、オブジェクトと、タスクを完了するための共同作業の仕方について考えてみることをお勧めします。実生活のメタファを使用して、欠落しているオブジェクトや責任を満たす必要があるかどうかを見つけ出すのに役立ちます。結局のところ、それはオブジェクト指向のパラダイムの本質に関するものです。リポジトリのパターンについてより深い情報については
、ここにあなたが始めるためにいくつかのリソースは次のとおりです。
バ、 私は静的メソッド/クラスを実装することができます。私はコミュニティから、どのパターンを使用するのか、なぜそれを使用するのかをよりよく理解したかったのです。おそらく、私はプログラミングの世界と初心者で5ヶ月ということを付け加えておいたほうがいいでしょう。 –
+1 - このような状況で実装するよりも 'パターン'が優れていません。必要なメソッドでクラスを作成します。一度それが大きくなりすぎる/複雑になるとリファクタリングします。 –