1

コードの一部でファクトリ メソッド デザイン パターンの使用を開始する必要があると感じています。これが私がやっていることです。

以下のコードは、Accom 名前空間のジェネレーター クラスです。

namespace Accom {

    public class Generator {

      int? _id;
      string _name;

      public Generator(int? id = null, string name = null) {
          _id = id;
          _name = name;
      }

      public string GetBaseUrl() { 

          //some logic sits here.

          return somestring;

      }

      //Can have some other methods as well

    }

}

Traf 名前空間も同じように起動します。

namespace Traf {
    public class Generator {
      int? _id;
      string _name;

      public Generator(int? id = null, string name = null) {
          _id = id;
          _name = name;
      }

      public string GetBaseUrl() { 
          //some logic sits here. Same one with the Accom.

          return somestring;
      }

      //Can have some other methods as well
    }
}

だから、これは何度も何度も繰り返されます。

そのためのファクトリパターンを作成しようとしましたが、すべての抽象クラスが混在していて、かなり混乱しました(そのようなことをやろうとしているのはこれが初めてだからだと思います)。

誰かがこれについて私を助けて、私が読んで理解できる良いソースコードを教えてくれますか?

4

2 に答える 2

0

AbstractFactoryPattern に関するこのコード プロジェクトの記事は、有用な例を提供するのに非常に優れている と思います。

ただし、よほどの理由がない限り、複数の異なる名前空間に同じクラスを作成しないでください。を使用して、いつでもusing Accom;Traf 名前空間から Generator クラスにアクセスできます。


異なる名前空間の各ジェネレーターには異なるメソッド セットがあるというコメントに応じて編集します。

実装に異なるメソッドがある場合、抽象ファクトリ パターンは使用できません。抽象ファクトリ パターンの考え方は、ファクトリによって返されるすべてのオブジェクトが実装する共通のインターフェイスを作成し、ファクトリ内のコンテキストを使用して、特定の状況に適した実装を選択することです。

ファクトリを使用することで得られる利点は、制御の反転と呼ばれます。基本的に、クライアント コードは Generator クラスの特定の実装に依存しません (その型の変数を持つか、その型のコンストラクターを呼び出すことによって)。

ただし、実装に固有のメソッドにアクセスする必要がある場合、共通のインターフェイスを介してそれらにアクセスすることはできません。つまり、制御の反転のメリットが得られないということです。つまり、メソッドを使用する本当の理由がないということです。抽象的な工場のパターン。

于 2011-07-27T13:44:20.080 に答える
0
  • ジェネレーターの抽象クラスを作成する
  • さまざまなタイプのジェネレーターの子クラスを作成する
  • ファクトリークラスを作る
  • ファクトリをシングルトンにする
  • パラメータを文字列として受け取る1つのメソッド(Common)を作成します(クラスが異なる名前空間にある場合は名前空間を使用)
  • リフレクションを使用して、共通のメソッドで異なるオブジェクトのインスタンスを作成します
  • 共通から基本型を返す
  • 別のインスタンスを取得するための別のメソッド (A、B、C) を作成し、メソッドを呼び出します (共通)
  • common から戻りたい型に結果をキャストする

編集

public abstract class Generator
{
    public Generator(int? i, string name) { }
    public abstract string GetBaseUrl();
}

public class GeneratorA : Generator
{
    public GeneratorA(int? i, string name) : base(i, name) { }
}
public class GeneratorB : Generator
{
    public GeneratorB(int? i, string name) : base(i, name) { }
}
public class GeneratorFactory
{
    // Make singleton
    public GeneratorB GenerateB(int? i, string name)
    {
        return (GeneratorB)this.Generate(i, name, "GeneratorB");
    }

    public GeneratorA GenerateA(int? i, string name)
    {
        return (GeneratorA)this.Generate(i, name, "GeneratorA");
    }

    public Generator Generate(int? i, string name, string genType)
    {
        return new GeneratorA(); // use reflection to generate child generator based on string "genType"
    }
}
于 2011-07-27T13:37:06.763 に答える