¿Cuál es la diferencia entre el patrón de fábrica y la fábrica abstracta?

40

Finalmente, comencé a tratar seriamente de aprender algunos patrones básicos (muy tarde en la carrera, pero esa es una historia diferente), estoy tratando de entender las diferencias entre el patrón de fábrica y la fábrica abstracta.

¿Cuáles son las diferencias clave entre estos dos patrones?

Entiendo que el Método Factory crea objetos a través de la herencia y Abstract Factory lo hace a través de la composición de objetos, pero desde un punto de vista práctico, todavía tengo problemas para visualizar exactamente cómo funcionan.

Phil.Wheeler
fuente
2
Para aclarar, ¿quiere decir "Método de fábrica" ​​cuando dice "Patrón de fábrica"? Si está hablando de los patrones de la Banda de los Cuatro, no hay un Patrón de Fábrica, pero sí hay un Resumen de Fábrica y un Método de Fábrica.
Thomas Owens
Sí, método de fábrica.
Phil.Wheeler
3
Para ser justos, las dos frases parecen intercambiarse con bastante frecuencia.
Phil.Wheeler
1
Ah, método de fábrica. Una solución alternativa para el hecho de que newno es un método (en algunos sistemas de objetos, ciertamente comunes).
Donal Fellows

Respuestas:

44

El Método de Fábrica generalmente se clasifica por una declaración de cambio donde cada caso devuelve una clase diferente, usando la misma interfaz raíz para que el código de llamada nunca necesite tomar decisiones sobre la implementación.

Piense en una fábrica de validadores de tarjetas de crédito que devuelve un validador diferente para cada tipo de tarjeta.

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

La Fábrica abstracta es donde tiene múltiples clases de fábrica concretas (no Métodos de fábrica) derivadas de una interfaz que puede devolver muchos tipos diferentes de diferentes métodos.

Piense en un administrador de juegos de ajedrez con una clase diferente para cada conjunto de reglas 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();
    }
}

Una Fábrica abstracta, al igual que una Estrategia, a menudo se selecciona utilizando un Método de fábrica, pero no es necesario combinarlas, por lo que es su propio patrón.

pdr
fuente
3
¿Es correcta esa explicación del método Factory? ¿Qué pasa con "El patrón del método de fábrica se basa en la herencia, ya que la creación de objetos se delega a las subclases que implementan el método de fábrica para crear objetos". Entonces el ejemplo se parece más a Static Factory.
SerG
@SerG Bueno, para ser justos, has recogido esa cita de Wikipedia, en una página que se leía de manera muy diferente hace tres años. Yo diría que la página actual de Wikipedia se contradice en varios lugares, pero no tengo el deseo de involucrarme en elegir eso. Lo que reconocería, en retrospectiva, es que el ejemplo que he proporcionado aquí es un tipo específico de Método de Fábrica, conocido como el Método de Fábrica Parametrizado. Pero el punto sobre la diferencia entre Factory Method y Abstract Factory es válido para todos los tipos de Factory Method.
pdr
2
La misma declaración que mi cita existe en GoF "Patrones de diseño". Y FM parametrizado también se describe allí.
SerG
La parte importante es que la fábrica le dará a la persona que llama un objeto adecuado, dependiendo de la situación particular, y la persona que llama no necesita saber cuál es exactamente la clase de ese objeto, y no necesita saber cómo ese objeto en particular fue elegido, siempre que el objeto sea compatible con una interfaz que conoce la persona que llama.
gnasher729
Debe aclarar en su respuesta que su ejemplo no es un patrón de método de fábrica típico, sino alguna especialización llamada método de fábrica parametrizado. Y escriba acerca de la definición del método típico de fábrica, porque está siendo erróneo en este momento. Estaba aprendiendo sobre el patrón del método de fábrica, entendí todo y luego leí esa respuesta que muestra el patrón del método de fábrica como algo diferente y estaba confundido. No hay información acerca de que ese ejemplo no sea un patrón de método de fábrica típico. Gracias a SerG por señalar eso en el comentario.
ctomek