問題は、どのように動作させたいのですか...このコンセプトにはいくつかのパターンがあります。
あなたは1を取得したい場合:
あなたは(人々の種類など)、多くの類似したものを持っている場合は、あなたがAbstract Factoryをお勧めします。その場合、静的であることは望ましくありません。しかし、再び、インスタンスを必要とするので、個々のファクトリを抽象ファクトリにバインドできます。そうすれば、 "Person Builder"ファクトリを渡すことになります。次に、あなたが個人を探すときはbuilder.buildPerson(id)
と呼ぶでしょう。そのメソッドは個体を検索し、実際にインスタンス化するクラスを決定し、それぞれのファクトリを呼び出します。
「人」の種類が1つだけの場合は、Factory methodを使用します。その場合、クラス(およびその子)がインスタンス化を担当するため、静的メソッドが優先されます。だから、person::getPerson(id)
に電話してください。
あなたは多くのを取得したい場合は:あなたは(そのようなfindPeople
法と同様に)多くの人々を取得したい場合は
、そして究極のソリューションは、おそらくあなたの必要性に依存するだろう。
オブジェクト作成で何らかの効率が必要な場合は、Flyweightパターンが必要です。
抽象ファクトリを使用している場合は、属性に基づいて複数のインスタンスを見つけるインスタンスメソッドを作成します。ファクトリメソッドを使用している場合は、別の静的メソッドを追加してファクトリメソッドを探します。
しかし、それ
を見てのもう一つの方法は、オブジェクト自体には関係しない「保存」やオブジェクトのデータの「ロード」ということですので、それは静的(メソッドとして属していませんか否か)。その場合、データストアを表すモデルを持つ方が良いでしょう。次に、ユーザーのリストを取得するには、peoplemodel.getPerson(id)
を呼び出します。 peoplemodel
はDBに対してフェッチし、オブジェクトを構成するために必要な情報をロードします。次に、Personクラスのファクトリを呼び出して実際のオブジェクトを構築し、それを返します。
これは、ストレージが実装から分離されているため、いいです。もちろん、それは別のレイヤーですが、余分なレイヤーを使用すると、複数のデータストアを持つようにすることも、ストレージ要件の異なる複数のアプリケーションに同じ人物クラスを使用することもできます。
だから、結論に:このケースでは、あなたが両側のインスタンスを使用する必要があると思いますので、今
、あなたは、静的メソッドを使用して、別のコンポーネントの疎結合を達成することはできません。だから、あなたはモデルにビルダーを渡して(依存関係注入)、人々オブジェクトを作成します。そして、モデルそのものが疎結合しているので、そのインスタンスを取得し、人を読み込む必要がある場所に渡します。
要するに、それはあなたが何をしようとしているかによって異なります。しかし、最も疎結合したコード(最も再利用可能で最もメンテナンス可能なもの)が必要な場合は、静的メソッドから離れ、抽象ファクトリ/ビルダーとDIに固執してください...
私は静的メソッドのアプローチのファンですが、他の方法(Peronsのインスタンスには、最初のインスタンスに関連するPersonインスタンスのコレクションを返すメソッドMySiblingsがあるかもしれません) 。それは一般的なデータアクセスのためにきれいです。しかし、私は他の方法(インスタンスメソッド)を行うための理由を聞いてオープンです。私の経験則では、特定のDAメソッドがアプリケーション全体で使用され、特定のインスタンスのメンバに依存しない場合、DA固有のクラスの静的なメンバにする傾向があります。 – XIVSolutions