Qual é a diferença entre o padrão de fábrica e a fábrica abstrata?


40

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

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

Entendo que o Método Factory cria objetos por herança e o Abstract Factory faz isso através da composição de objetos, mas, do ponto de vista prático, ainda estou tendo problemas para visualizar exatamente como cada um deles funciona.



2
Para esclarecer, você quer dizer "Método de Fábrica" ​​quando 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á Fábrica Abstrata e Método de Fábrica.
Thomas Owens

Sim - Método de Fábrica.
Phil.Wheeler

3
Para ser justo, as duas frases parecem ser bastante trocadas.
Phil.Wheeler

11
Ah, método de fábrica. Uma solução alternativa para o fato de newnão ser um método (em alguns sistemas de objetos - reconhecidamente comuns).
Donal Fellows

Respostas:


44

O método Factory 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 validadores de cartão de crédito que retorne 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 gerente de jogos 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, é freqüentemente selecionada usando um Método de Fábrica, mas não é necessário combiná-las, para que seja seu próprio padrão.


3
Essa explicação do método Factory está correta? O que é "O padrão do método de fábrica depende da herança, pois a criação de objetos é delegada a subclasses que implementam o método de fábrica para criar objetos". Portanto, o exemplo é mais parecido com a Static Factory.
SerG 15/10

@SerG Bem, para ser sincero, você pegou essa citação da Wikipedia, em uma página que é muito diferente há três anos. Eu argumentaria que a página atual da Wikipedia se contradiz em vários lugares, mas não tenho o desejo de me envolver nessa escolha. O que eu admitiria, em retrospectiva, é que o exemplo que forneci 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 o Método de Fábrica e o Abstract Factory se aplica a todos os tipos de Método de Fábrica.
Pd15

2
A mesma declaração que minha citação existe no GoF "Design Patterns". E FM parametrizado também é descrito lá.
SerG

A parte importante é que a fábrica dará ao chamador um objeto adequado, dependendo da situação específica, e o chamador não precisa saber exatamente qual é a classe desse objeto e não precisa saber como o objeto em particular foi escolhido, desde que o objeto suporte uma interface que o chamador conheça.
gnasher729

Você deve declarar claramente em sua resposta que seu exemplo não é um padrão típico de método de fábrica, mas alguma especialização denominada método de fábrica parametrizado. E escreva sobre a definição do método típico de fábrica, porque está enganando no momento. Eu estava apenas aprendendo sobre o padrão de método de fábrica, entendi tudo e depois li a resposta que mostra o padrão de 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 típico de método de fábrica. Agradeço à SerG por esclarecer isso no comentário.
Ctomek
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.