Design de classe de acordo com o Padrão de fábrica do COI e abstrato
-
27-09-2019 - |
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?
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.