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

39

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 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 através de herança e o Abstract Factory faz isso através da composição de objetos, mas do ponto de vista prático, eu ainda estou tendo problemas para visualizar exatamente como eles funcionam.

    
por Phil.Wheeler 06.06.2011 / 11:25
fonte

1 resposta

42

O Método de Fábrica é geralmente categorizado por uma instrução switch onde 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 validação 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");
    }
}

A Fábrica abstrata é onde você tem várias classes de fábrica de concreto (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 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, muito parecida com uma Estratégia, é frequentemente selecionada usando um Método de Fábrica, mas não é necessário combiná-las para que seja seu próprio padrão.

    
por 06.06.2011 / 11:49
fonte