質問
抽象的な工場の方法に値を提供する正しい方法はどれですか?
例えば。
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;
}
}
他のヒント
一貫していると思います。リポジトリが使用されている他のどこでも注入されている場合、インターフェイスの一部にするのではなく、工場のコンストラクターに注入することは理にかなっています。
所属していません StackOverflow