2016-05-15 15 views
0

おはようございます! 私はビデオゲームの実装に問題があり、私はここでいくつかの助けを求めるでしょう。 私は "mainaction"と "quickaction"という2つのタイプのアクションをプロジェクトに持っていますが、どちらも特定のメソッドを実装するいくつかのサブクラスを持っています。 私はこのような状況を実装するためにファクトリメソッドを使いたいので、 "Action"というインターフェイスをインスタンス化し、2つのクラスのアクションがそのインターフェイスを実装します。抽象クラスによるファクトリメソッド

私の質問は、この場合、mainactionとquickactionを使用して工場を使用する方法か、それらのサブクラスを使用してファクトリを実装する方が良いでしょうか?どうすればいい?一般的に

答えて

0

が、それは常に実際に可能

と同じくらい一般的であることをメソッドの戻り値の型を指定することをお勧めします、これは工場ではなく、オブジェクト自体のコンストラクタを使用しての強みの一つであります:返されるオブジェクトの振る舞いが戻り値の型によって指定されている場合は、返されるオブジェクトを自由に変更することができます。

クラスを抽象クラス(またはできればインターフェイス)で参照する場合は、他の人がここに入力できます)、後でサブモデルである限り、完全に別のオブジェクトを工場から返すことにします抽象クラスの型/は、ファクトリメソッドが返すインタフェースを実装します。つまり、アクションクラスへのすべての通信がファクトリメソッドの戻り値型のインターフェイスを経由するため、クライアントコードは、あなたの 'アクション'クラスの実装の詳細の変更を受けません。

MainActionQuickActionが、彼らはかなり同様の目的のためにかなり似た設定に使用される意味、関連する

場合は、あなたの質問に直接答えは、私は戻って、サブタイプを返すファクトリメソッドで、彼らのために工場を作成しますActionです。これにより、できるだけ多くの実装の詳細をクライアントから隠すことができます。また、アクションクラスを一般的な方法で参照しています。

MainActionQuickActionが大きく違った概念を表している場合は、それぞれのクラスにいくつかの静的ファクトリメソッドを実装するだけで、ファクトリを気にする必要はありません。この背後にある理由は、2つの異なるタイプのオブジェクトのファクトリを作成すると、工場ではlow cohesionになります。同じインターフェースを使用して同じ機能を提供しない異なる概念を参照することは、あまりにも一般的な戻り型を指定する例です。

しかし、かなり限られた経験から描いていることに注意してください。

ジョシュア・ブロッホが「効果的なJava」を読むことをお勧めします。私はその本から多くを学びました。

+0

私はあなたのコメントに特に不一致はありませんが、(編集後であっても)その質問に対する回答ではありません。 –

+0

@ジョン私は疑問を誤解しているかもしれません。あなたは精巧にできますか? – SecularisticSloth

+0

OPは、工場/工場の方法のパターン、その一般的な形式、およびその使用の理由についてのアイデアをすでに把握しているようです。 OPの質問には、工場がどのような具体的な形態をとるべきか、どのように具体化すべきかという2つの問題があります。それはあまりにも広いので、実際には特に良い質問ではありません。 –

0

クライアントがIActionで宣言されたメソッドのみを必要とする場合は、ファクトリにIActionを返させます。たとえば、

public static IAction Create(string details) {...} 

クライアントにQuickActionとMainActionに固有の方法が必要な場合は、工場に2つの方法があります。例えば、

public static MainAction CreateMainAction(string details) {...} 
public static QuickAction CreateQuickAction(string details) {...} 

これらのメソッドの実装は、特定のサブクラスを作成するdetailsを使用します。クライアントは絶対にキャストする必要はありません。むしろ、彼らは多型に頼っています。

関連する問題