Pergunta

Qual é a maneira correta de fornecer valores a um método abstrato de fábrica?

Por exemplo.

interface IFactory
{
  ISomething Create(int runTimeValue);
}

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

No exemplo, o repositório é injetado através do construtor quando a fábrica é criada, mas eu poderia mover o repositório para a interface ifActory

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

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

O que é considerado uma maneira "correta" de fazer isso? Como uma razão para projetar uma fábrica abstrata?

Foi útil?

Solução

Padrão de fábrica abstrato deve ser usado nos casos em que os objetos retornados pela fábrica precisam ser "inicializados" de maneira diferente de tal maneira que apenas a fábrica saiba como fazê -lo. Portanto, implementações diferentes do ISOMODING serão "inicializadas" ou criadas de maneira diferente e apenas suas respectivas implementações de fábrica sabem como fazê -lo.

No seu caso, você deve se perguntar:

Fazer tudo As implementações de isomethethethethethethethethethethethethets precisam do irepository e do RUNTimeValue?. Nesse caso, você pode apenas usar o padrão de fábrica.

Use a fábrica abstrata nesse cenário: (algo e alguma coisa é criada de maneira diferente)

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;
  }
}

Outras dicas

Eu diria ser consistente. Se o seu repositório for injetado em qualquer outro lugar em que seja usado, faria sentido injetá -lo no construtor da fábrica, em vez de torná -lo parte da interface.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top