3

これを解決できるデザインパターンがあるかどうかを確認しようとしています。

プロパティa、b、cを持つ抽象クラスAを作成しました。クラスAを拡張し、さらにプロパティを追加する別のクラスBがあります:x、y、z。次に、Aを拡張してi、j、kを追加する別のクラスCがあります。最後に、BまたはCを作成するインスタンスを決定するファクトリメソッドがあり、それがヘルプが必要な部分です。このファクトリメソッドはどのように、または何を返す必要がありますか:Aのインスタンスを返す場合、どの特定のインスタンスがBまたはCで作成されたかわかりませんか?具体的なインスタンスを作成するには、このファクトリメソッドが必要です。これで、createBやcreateCのような静的メソッドを記述できることがわかりましたが、ここで別のデザインパターンなどのより一般的なソリューションを探しています。

更新:具象クラスを知りたい理由は、このオブジェクトをフロントエンドjspに渡す必要があるためです。そのJSPは、適切なゲッターを呼び出すことができるように、どの特定のクラスがインスタンス化されたかを知る必要があります。

4

6 に答える 6

1

ファクトリパターンをそのまま維持します。したがって、戻りタイプはAbstractAクラスになります。B&Cは、プロキシパターンを介してプロパティも継承する必要があります。

したがって、CAble&BAbleインターフェイスを作成し、CとBをAのインスタンスとして使用し(両方とも同じファクトリによって生成されるため)、BとCをキャストしてインターフェイスの説明として機能させます。

乾杯!

アップデート:

私はあなたが必要なものを理解したと思います、次のことを想像してください:学校のページで。学生と教授の一般的な見解があり、どちらも共通の分野と個別の分野を持っていますが、共通の要求はschoolMemberです。

class SchoolMember // The return type of your Factory
  -name
  +getView():SchoolMemberView // Will be used by the View//View Model

Interface Professor
  getProfession()
Interface Student
  getSemester() 

class FacultyMamber: SchoolMember,Professor
  -profession
  +getView():SchoolMemberView
class UniStudent: SchoolMember,Student
  -semmester
  +getView():SchoolMemberView
于 2012-10-29T16:59:14.830 に答える
0

あなたの説明の響きから、BとCの両方にAとの共通点はありません。各クラスには特定のプロパティがありますが、共通点や関連性については何もありません。クラス間に関係がない場合は、継承を使用しないでください。

ただし、質問で言及していない共通の関係がある場合は、ファクトリメソッドパターンがおそらく探しているものになります。

于 2012-10-29T16:39:39.780 に答える
0

問題を読むときに頭に浮かぶのは、抽象的なファクトリパターンだけです。

http://en.wikipedia.org/wiki/Abstract_factory_pattern

于 2012-10-29T16:39:51.283 に答える
0

ファクトリメソッドはAのインスタンスを返す必要があります。具象オブジェクトがBかCかを知る必要がある場合は、Reflectionパターンであるinstanceof演算子を使用できます。理想的には、BまたはCのどちらを持っているかを知る必要はありません。そのロジックはすべて、Aのメソッドのポリモーフィズムによって処理される必要があります。

于 2012-10-29T16:41:14.440 に答える
0

ファクトリパターンの説明で警告として正確に言及されている点。

アプリケーションを設計するときは、オブジェクトを作成するためのファクトリが本当に必要かどうかを考えてください。多分それを使うことはあなたのアプリケーションに不必要な複雑さをもたらすでしょう。とにかく、同じ基本タイプのオブジェクトが多数あり、それらをほとんど抽象オブジェクトとして操作する場合は、ファクトリが必要です。私はあなたのコードは次のようなたくさんのコードを持っているはずです、それを再考してください。

if (genericProduct typeof ConcreteProduct)
    ((ConcreteProduct)genericProduct).doSomeConcreteOperation();

ソース:http ://www.oodesign.com/factory-method-pattern.html

于 2012-10-29T16:42:22.187 に答える
0

Builder patternBuilderに設定された特殊なフィールドに基づいて、どのオブジェクトを構築するかを知っていることをお勧めします。

于 2012-10-29T16:49:30.097 に答える