Habiendo finalmente empezado a tratar seriamente de aprender algunos patrones básicos (muy tarde en la carrera, pero esa es una historia diferente), estoy tratando de obtener mi Diríjase a las diferencias entre Factory Pattern y Abstract Factory.
¿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 cada uno.
Comentarios
Respuesta
El Método de fábrica generalmente se clasifica mediante una declaración de conmutación donde cada caso devuelve una clase diferente, utilizando 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 Abstract Factory es donde tiene varias 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 combinarlos para que tenga su propio patrón.
Comentarios
- ¿Es correcta esa explicación del método Factory? Qué ' s acerca de " El patrón del método de fábrica se basa en la herencia, ya que la creación de objetos se delega a subclases que implementar el método de fábrica para crear objetos ". Así que el ejemplo se parece más a Static Factory.
- @SerG Bueno, para ser justos, ' ha recogido esa cita de Wikipedia, en una página que decía muy diferente hace tres años. Yo diría que la página actual de Wikipedia se contradice en varios lugares, pero no ' no tengo el deseo de involucrarme en separar eso. Lo que concederí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 el método de fábrica y el método de fábrica abstracto se mantiene en todos los tipos de método de fábrica.
- Existe la misma declaración que mi cita en GoF " Patrones de diseño ". Y FM parametrizado también se describe allí.
- 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 ' t necesita saber cuál es exactamente la clase de ese objeto, y no ' t necesita saber cómo se eligió el objeto en particular, siempre que el objeto admita una interfaz que el el llamador conoce.
- Debe dejar claro 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 sobre la definición del método típico de fábrica, porque en este momento se está confundiendo. 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 típico de método de fábrica. Gracias a SerG por señalarlo en el comentario.
new
no es ' un método (en algunos sistemas de objetos, ciertamente comunes).