質問

抽象的な工場の方法に値を提供する正しい方法はどれですか?

例えば。

interface IFactory
{
  ISomething Create(int runTimeValue);
}

class Factory : IFactory
{
  public ISomething Create(int runTimeValue)
  {
    return new Something(repository, runTimeValue);
  }
}

例では、工場が作成されたときにリポジトリがコンストラクターを介して注入されますが、代わりにリポジトリをiFactoryインターフェイスに移動できます。

interface IFactory
{
  ISomething Create(IRepository repository, int runTimeValue);
}

class Factory : IFactory
{
  public ISomething Create(IRepository repository, int runTimeValue)
  {
    return new Something(repository, runTimeValue);
  }
}

これを行う「正しい」方法と見なされるものは何ですか?抽象的な工場を設計する際に、1つの理由はどのようにすべきですか?

役に立ちましたか?

解決

抽象的な工場パターン 工場によって返されたオブジェクトが、工場だけがそれを行う方法を知っているような方法で「初期化」する必要がある場合に使用する必要があります。したがって、Isomethingのさまざまな実装は「初期化」されるか、異なる方法で作成され、それぞれの工場の実装のみがそれを行う方法を知っています。

あなたの場合、あなたは自問する必要があります:

行う すべて Isomethingsの実装には、iRepositoryとRuntimevalueが必要ですか?その場合、工場パターンを使用することができます。

このようなシナリオで抽象的な工場を使用してください:(何かと他のものが異なる方法で作成されます)

interface IFactory {
  ISomething Create(int runTimeValue);
}

class Factory : IFactory {
  public ISomething Create(int runTimeValue)  {
    return new Something(repository, runTimeValue);
  }
}

class OFactory : IFactory {
  public ISomething Create(int runTimeValue) {
    // constructor takes different parameters
    SomeOtherthing thing = new SomeOtherthing("someValue", runtimeValue);
    thing.SetCustomRepository(new OtherRepositoryImpl());
    return thing;
  }
}

他のヒント

一貫していると思います。リポジトリが使用されている他のどこでも注入されている場合、インターフェイスの一部にするのではなく、工場のコンストラクターに注入することは理にかなっています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top