2016-10-20 5 views
4

私は自分自身にこの質問をしましたが、これについてはまだ考えていません。戦略を自動的に見つけるファクトリを実装する方法

は何が戦略パターンを持っているとき、私は

考えています、実装の多くは、特定の戦略を取得するために、工場出荷時のパターンを使用しています。インターネット上のほとんどの工場の例では、switch文またはif文を使用しています。戦略を頻繁に変更したり追加したりしないときは、これは完全に機能します。しかし、工場が戦略を動的に見つけ出し、戦略が頻繁に変更され追加される場合はどうでしょうか。それでは、これはプログラマーの常勤です。今私は、工場を変更することなく新しい戦略を追加したいという状況があります。言い換えれば、ファクトリパターンを実装して、戦略を動的に検索する方法です。そして、私はどのように利用可能なすべての戦略をリストアップできますか?

問題

私はインターネット上でこれを見ると、私は良い適切な解決策を見つけることができません。私はこれを行うためにリフレクションライブラリを使用することを考えていますが、見た目のどこでも反射を使用することはお勧めしません。どのように動的なファクトリを実装するか。あるいは、この目的のために他のパターンがありますか?

戦略: enter image description here

工場:

public enum StrategyName { ImplementedStrategy1, ImplementedStrategy2, ImplementedStrategy3 }; 

public class StrategyFactory 
{ 
    public static Sniffer getInstance(StrategyName choice) { 

     Strategy strategy = null; 

     switch (choice) { 
      case StrategyName.ImplementedStrategy1: 
       strategy = new ImplementedStrategy1(); 
       break; 
      case StrategyName.ImplementedStrategy2: 
       strategy = new ImplementedStrategy2(); 
       break; 
      case StrategyName.ImplementedStrategy3: 
       strategy = new ImplementedStrategy3(); 
       break; 
     } 

     return strategy; 
    } 
} 

が今どのように私はこれを動的にすることができますか?それとも私はなぜならないのですか?

+0

これは私にとっては気分が悪いです。あなたは文脈を詳述できますか? –

+0

コンテキストの例:さまざまなWebサイトから情報を取得するWebスクレーパー。掻き取られたウェブサイトは変更することができます。掻き取られる必要のあるすべてのウェブサイトには、他の戦略が必要です。ユーザは、彼が掻き出したいウェブサイトまたは彼が使用したい戦略を選択する。プログラマーは新しいWebページ/戦略のサポートを多くの短期間で追加する必要があります。 – botenvouwer

答えて

1

ImplementedStrategy契約にはIsGoodMatch(params)メソッドが含まれていますか?次に、戦略のコレクションを繰り返し、1つ(または多く)の結果が得られるまでそれぞれIsGoodMatchを呼び出し、その戦略を使用します。

+0

いいですが、利用可能なすべての戦略のリストをどのように作成しますか?私もこれを試してみるつもりです。あなたは私にソリューションのインスピレーションを与えました。私が達成したいのは、新しいクラスを追加し、既存のコードを変更することなくその作業を行うことです。 – botenvouwer

+0

何らかの種類のIoCコンテナで戦略のリストを作成したり、リフレクションを使用してアセンブリをスキャンしたりできます。 – GWLlosa

1

これが助けになるかどうかはわかりませんが、ここで私は何を考えていますか? あなたが

public class ImplementedStrategy1 : Strategy 
{ 

} 

public class ImplementedStrategy2 : Strategy 
{ 

} 

などを持っている...

次に、属性クラス[StrategyName(StrategyName.EnumValue)]を作ります。ここ 詳細https://msdn.microsoft.com/en-us/library/aa288454(v=vs.71).aspx

だから、今、我々はあなたが戦略と継承するすべての種類を取得し、リフレクションを使用して、代わりにスイッチのパブリック静的スニファのgetInstance(StrategyNameの選択)で、次に

[StrategyName(StrategyName.EnumValue1)]. 
public class ImplementedStrategy1 : Strategy 
{ 

} 

[StrategyName(StrategyName.EnumValue2)]. 
public class ImplementedStrategy2 : Strategy 
{ 

} 

を取得します選択パラメータがカスタム属性値と一致するかどうかを確認します。

これで、そのタイプの新しいインスタンスを作成するだけで済みます。

これが完了したら、新しい戦略を追加するには、属性を使用して新しいクラスを作成し、列挙に新しい値を追加するだけです。

実装に関するヘルプが必要な場合はお知らせください。

+0

C#固有のため、これは素晴らしいようです。私はこれを試してみるつもりです。これがJavaでできるかどうか疑問に思います。 – botenvouwer

+0

Javaでの私の経験は限られています。私はあなたが属性クラスに似た何かにアクセスできるかどうかわからない。しかし、私は方法があると確信しています – Lidaranis

関連する問題