2011-08-04 13 views
1

に、私は複数の部門があるでしょうし、各部門の個別の処理クラスがあるだろうしたアプリケーションを書いています。 各部門と部門の処理は、別々のクラスで表されます。デザインパターンは、もし、一連を削除する必要があります。..よそオブジェクトの初期化

ので、今のJavaの主な方法は、より多くの場合、他のはしごのシリーズのように見えます。

私はもともと書かれたクラスはあまり変更することなく、より多くの部門とその処理クラスを後から追加できるように、それはより柔軟にすることのいずれかの方法はあります?

私は抽象ファクトリパターンについて読んだことがありますが、それ以外の解決策はありますか?

+1

私は人々がこの質問にどのように答えているのか分かりません。あなたの質問はあまり明確ではない、言い直すことを検討してください。あなたが現在持っているものの "愚かな"下の例を掲示するのに役立つかもしれません。 – Nix

+0

抽象ファクトリパターンの使用に問題がありますか? –

+1

まあ、問題はありませんが、私は実際の実装に行く前にすべての可能なオプションを検討したいだけです。 –

答えて

1

言います。 Department Processorsの階層と、Departmentクラスの階層構造が必要です。抽象的なファクトリは、いくつかのディスクリミネータに基づいて各ペアの具体的なファクトリを生成し、あなたの部門を処理し、Departmentオブジェクトを返します。

それは単に適切な弁別を渡す部門を取得するファクトリを使用しますので、あなたのアプリケーションの残りの部分は、部門オブジェクトの作成の違いを意識する必要はありません。

新しい部門CLASを必要とする新しい部門、プロセッサのクラスを追加し、工場出荷時のロジックを更新。


また、部門の構造はすべて同じですが、処理が異なる場合は、戦略パターンのようなものを使用することを検討してください。この場合、あなたは単一の部署を持っていますが、代わりに戦略のための処理についての決定が行われます。したがって、適切な戦略が部門に注入され、部門の行動はそれに応じて異なります。

1

トピックに専念するウェブサイトがあります。あなたは多形性を使用したいと思っています。

http://www.antiifcampaign.com/

1

あなたは、各状態のためのフィールドを持つ列挙型を作成することができます。その後、抽象メソッドinit()を列挙型で作成し、各メンバーに対して実装します。

あなたのコードでは、例のプロパティファイルのための状態を取得することができ、その後、Abstract Factoryパターンは、おそらくあなたが説明したシナリオに最も適したState.valueOf(state).init()

+0

私たちはenumでも抽象メソッドを持つことが許されていますか? –

+0

enumは抽象メソッドを持ち、インタフェースを実装できますが、各enum値で実装する必要があります。 –

2

"Department"などの部門を非表示にするインターフェイスを作成します。

main() { 
    String criteria = ...; // this is how we choose the department to use, 
          // and you probably don't want to use a String 
          // but some other, more expressive type 
    for (Department department : departments) { 
     if (department.supports(criteria)) { 
      department.doWhatever(); 
     } 
    } 
} 

departmentsコレクションを移入する依存性注入を使用すると:ようなあなたの主な方法は書きます。設定方法によっては、純粋な構成になる可能性があります。

+0

おそらく複雑で、それ自身のクラスにあるべきであるものをカプセル化するために文字列を使用することは、非常に良い方法ではないようです。 – Atreys

+0

@Atreys:私は同意します。 mainメソッドもString []引数を取るべきです。それは単なる例です。コード例に明示的に追加しました。 –

1

「ファクトリー」または「抽象ファクトリー」デザインパターンを使用すると、最初のステップになります。これは、オブジェクトの初期化ロジックをメインコードから取り出し、ファクトリクラスで分離します。このようにして、あなたのメインコードは修正のために閉じられ、拡張のために開かれます(a.k.a. Open Closed Principle)。あなたが行った変更は、工場クラスで分離されます。

この手順をさらに進めたい場合は、反射を使用することもできます。例は次のようになります。このコードで

static Object createObject(String className) { 
    Object object = null; 
    try { 
     Class classDefinition = Class.forName(className); 
     object = classDefinition.newInstance(); 
    } catch (InstantiationException e) { 
     System.out.println(e); 
    } catch (IllegalAccessException e) { 
     System.out.println(e); 
    } catch (ClassNotFoundException e) { 
     System.out.println(e); 
    } 
    return object; 
} 

、あなたは、単にこのようなオブジェクトを作成することができます:あなたはリフレクションを使用する場合もちろん

public static void main(String[] args) { 
    NewDepartment dep = (NewDepartment) createObject("yourpackage.NewDepartment"); 
} 

を、trade-offがあります。それはそれを使うかどうかのあなたの裁量です。

関連する問題