Tendo finalmente começado seriamente a tentar aprender alguns padrões básicos (bem tarde na carreira, mas essa “é uma história diferente), estou tentando entender conheça as diferenças entre o Factory Pattern e o Abstract Factory.

Quais são as principais diferenças entre esses dois padrões?

Eu entendo que o Factory Method cria objetos por meio de herança e o Abstract Factory sim por meio da composição de objetos, mas do ponto de vista prático, ainda estou tendo problemas para visualizar exatamente como cada um deles funciona.

Comentários

  • stackoverflow.com/questions/1001767/…
  • Para esclarecer, você quer dizer " Método de fábrica " quando você diz " Padrão de fábrica "? Se você está falando sobre os padrões da Gangue dos Quatro, não há Padrão de Fábrica, mas há Fator Abstrato y e Método de fábrica.
  • Sim – Método de fábrica.
  • Para ser justo, as duas frases parecem ser comumente trocadas.
  • Ah, Método de fábrica. Uma solução alternativa para o fato de que new não é ' um método (em alguns sistemas de objetos – reconhecidamente comuns).

Resposta

O Método de fábrica geralmente é categorizado por uma instrução switch em que cada caso retorna uma classe diferente, usando a mesma interface raiz para que o código de chamada nunca precise tomar decisões sobre a implementação.

Pense em uma fábrica de validador de cartão de crédito que retorna um validador diferente para cada tipo de cartão.

public ICardValidator GetCardValidator (string cardType) { switch (cardType.ToLower()) { case "visa": return new VisaCardValidator(); case "mastercard": case "ecmc": return new MastercardValidator(); default: throw new CreditCardTypeException("Do not recognise this type"); } } 

O Abstract Factory é onde você tem várias classes de fábrica concretas (não métodos de fábrica) derivadas de uma interface que pode retornar muitos tipos diferentes de métodos diferentes.

Pense em um gerenciador de jogo de xadrez com uma classe diferente para cada conjunto de regras variantes.

public class StandardChessRulesFactory : IChessRulesFactory { public IBoardMapper GetBoardMapper() { return new StandardChessBoardMapper(); } public IKingMover GetKingMover() { return new StandardChessKingMover(); } public IMoveClock GetMoveClock() { return new StandardMoveClock(); } } public class HexagonalChessRulesFactory : IChessRulesFactory { public IBoardMapper GetBoardMapper() { return new HexagonalChessBoardMapper(); } public IKingMover GetKingMover() { return new HexagonalChessKingMover(); } public IMoveClock GetMoveClock() { return new StandardMoveClock(); } } public class SpeedChessRulesFactory : IChessRulesFactory { public IBoardMapper GetBoardMapper() { return new StandardChessBoardMapper(); } public IKingMover GetKingMover() { return new StandardChessKingMover(); } public IMoveClock GetMoveClock() { return new SpeedChessMoveClock(); } } 

Uma fábrica abstrata , bem como uma estratégia, é frequentemente selecionada usando um método de fábrica, mas não é necessário combiná-los para que seja seu próprio padrão.

Comentários

  • Essa explicação do método Factory está correta? O que ' s sobre " O padrão do método de fábrica depende da herança, já que a criação do objeto é delegada a subclasses que implemente o método de fábrica para criar objetos ". Portanto, o exemplo é mais parecido com Static Factory.
  • @SerG Bem, para ser justo, você ' pegou essa citação da Wikipedia, em uma página que dizia muito diferentemente há três anos. Eu diria que a página atual da Wikipedia se contradiz em vários lugares, mas eu não ' não tenho o desejo de me envolver em separá-la. O que eu admitiria, em retrospecto, é que o exemplo que ' vi aqui é um tipo específico de Método de Fábrica, conhecido como Método de Fábrica Parametrizado. Mas o ponto sobre a diferença entre Factory Method e Abstract Factory se aplica a todos os tipos de Factory Method.
  • A mesma declaração que minha citação existe em GoF " Padrões de design ". E FM parametrizado também é descrito lá.
  • A parte importante é que a fábrica dará ao chamador um objeto adequado, dependendo da situação particular, e o chamador não ' não precisa saber exatamente qual é a classe desse objeto e não ' não precisa saber como o objeto específico foi escolhido, contanto que o objeto suporte uma interface que o o chamador sabe sobre.
  • Você deve deixar claro em sua resposta que seu exemplo não é um padrão de método de fábrica típico, mas alguma especialização chamada método de fábrica parametrizado. E escreva sobre a definição do método de fábrica típico, porque é um erro neste momento. Eu estava aprendendo sobre o padrão do método de fábrica, entendi tudo e então li aquela resposta que mostra o padrão do método de fábrica como algo diferente e fiquei confuso. Não há informações sobre esse exemplo não ser um padrão de método de fábrica típico. Obrigado ao SerG por apontar isso no comentário.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *