Nota: las preguntas se encuentran al final de la publicación.
He leído los otros hilos de stackoverflow con respecto a Abstract Factory vs Factory Method . Entiendo la intención de cada patrón. Sin embargo, no tengo clara la definición.
El Método de Fábrica define una interfaz para crear un objeto, pero permite que las subclases decidan cuáles instanciar. Un método de fábrica permite que las clases difieran la creación de instancias en subclases.
Por el contrario, una Fábrica abstracta proporciona una interfaz para crear familias de objetos relacionados o dependientes sin especificar sus clases concretas.
El Abstract Factory es muy similar al método de fábrica . He dibujado algunas clases de UML para ilustrar mi punto.
Nota:
- El diagrama es de www.yuml.com, por lo que no están perfectamente orientados. Pero es un servicio gratuito :).
- Los diagramas pueden no ser perfectos. Todavía estoy aprendiendo los patrones de diseño de GoF .
Método de fábrica
Abstract Factory (solo 1 miembro):
Fábrica abstracta (más miembros):
Preguntas:
- Si Abstract Factory solo tiene un creador y un producto, ¿sigue siendo el patrón Abstract Factory ? (una interfaz para crear familias)
- ¿Se puede crear el creador concreto Factory Method desde una interfaz o tiene que ser de una clase? (las clases difieren las instancias a subclases)
- Si Abstract Factory puede tener solo un creador y un producto, ¿es la única diferencia entre Abstract Factory y Factory Method que el creador para el primero es una Interfaz y el creador para el segundo es una Clase?
Respuestas:
Espero que esto ayude. Describe los diversos tipos de fábricas. Usé Head First Design Patterns como mi referencia. Solía yuml.me a diagrama.
Fábrica estática
Es una clase con un método estático para producir varios subtipos de producto.
Fábrica simple
Es una clase que puede producir varios subtipos de Producto. (Es mejor que la fábrica estática. Cuando se agregan nuevos tipos, la clase de producto base no necesita cambiarse solo la clase de fábrica simple)
Método de la fábrica
Contiene un método para producir un tipo de producto relacionado con su tipo. (Es mejor que Simple Factory porque el tipo se difiere a una subclase).
Fábrica abstracta
Produce una familia de tipos que están relacionados. Es notablemente diferente a un Método de Fábrica ya que tiene más de un método de tipos que produce. (Esto es complicado; consulte el siguiente diagrama para obtener un mejor ejemplo de la vida real).
Ejemplo de .NET Framework
DbFactoriesProvider es una Fábrica simple ya que no tiene subtipos. DbFactoryProvider es una fábrica abstracta, ya que puede crear varios objetos de base de datos relacionados, como objetos de conexión y comando.
fuente
Product
(como resumen), y luegoProduct1
yProduct2
, como hijos? Eso ayudaría al punto de que Factory Method se trata solo de crear un producto, mientras que Abstract Factory es más o menos un grupo de Factory Method reunidos en familias.¡Los dos patrones están ciertamente relacionados!
La diferencia entre patrones generalmente está en la intención.
La intención del Método Factory es "Definir una interfaz para crear un objeto, pero dejar que las subclases decidan qué clase instanciar. El Método Factory permite que una clase difiera la instanciación a subclases".
La intención de Abstract Factory es "Proporcionar una interfaz para crear familias de objetos relacionados o dependientes sin especificar sus clases concretas".
Basándome exclusivamente en estas declaraciones de intenciones (citadas por GoF), diría que, de hecho , el Método Factory es, en cierto sentido, una Fábrica abstracta "degenerada" con una familia de uno.
En general, tienden a diferir en la implementación, ya que Factory Method es mucho más simple que Abstract Factory .
Sin embargo, también están relacionados en la implementación. Como se señala en el libro de GoF,
Este wiki de c2 también tiene una discusión interesante sobre este tema.
fuente
Parece que la lista de preguntas (excelentes) del OP ha sido ignorada. Las respuestas actuales simplemente ofrecen definiciones repetidas. Así que intentaré abordar las preguntas originales de manera concisa.
No se . Una Fábrica abstracta debe crear más de un producto para formar una "familia de productos relacionados". El ejemplo canónico de GoF crea
ScrollBar()
yWindow()
. La ventaja (y el propósito) es que Abstract Factory puede imponer un tema común en sus múltiples productos.Primero, debemos tener en cuenta que ni Java ni C # existían cuando el GoF escribió su libro. El uso de GoF del término interfaz no está relacionado con los tipos de interfaz introducidos por idiomas particulares. Por lo tanto, el creador concreto se puede crear desde cualquier API. El punto importante en el patrón es que la API consume su propio Método de Fábrica, por lo que una interfaz con un solo método no puede ser un Método de Fábrica más de lo que puede ser una Fábrica Abstracta.
Esta pregunta ya no es válida, siguiendo las respuestas anteriores; sin embargo, si se queda pensando que la única diferencia entre Abstract Factory y Factory Method es la cantidad de productos creados, considere cómo un cliente consume cada uno de estos patrones. Una Fábrica abstracta generalmente se inyecta en su cliente y se invoca a través de composición / delegación. Un método de fábrica debe ser heredado. Por lo tanto, todo vuelve al antiguo debate de composición vs. herencia.
¡Pero estas respuestas han planteado una cuarta pregunta!
Si el método es estático, comúnmente se llama Fábrica estática . Si el método no es estático, comúnmente se llama Fábrica simple . Ninguno de estos es un patrón GoF, ¡pero en la práctica se usan mucho más comúnmente!
fuente
En mi opinión, la ligera diferencia entre los dos patrones reside en la aplicabilidad y, como ya se dijo, en la intención .
Recapitulemos las definiciones (ambas de Wikipedia).
Fábrica abstracta
Método de la fábrica
Ambos patrones permiten desacoplar los objetos de usuario de la creación de instancias necesarias (desacoplamiento en tiempo de ejecución), y este es el aspecto común. Ambos patrones permiten crear una jerarquía de fábricas de acuerdo con cualquier necesidad específica, y este es otro aspecto común.
Abstract Factory permite crear varios tipos diferentes de instancias en una subclase y particularizar el comportamiento de las creaciones en sus diferentes subclases; normalmente, el método Factory declara la creación de un solo tipo de objeto que se puede particularizar de acuerdo con el mecanismo de subclasificación. Esa es la diferencia.
Resumiendo Digamos que Product define la superclase de los objetos de creación, y que ProductA y ProductB son dos subclases diferentes. Por lo tanto, el método Abstract Factory tendrá dos métodos, createProductA () y createProductB () que se particularizarán (en términos de pasos de creación) en sus subclases específicas: las subclases de fábrica particularizan los pasos de creación para las dos clases definidas de objetos bajo creación.
Según el ejemplo anterior, el Método Factory se implementará de manera diferente, abstrayendo la creación de ProductA y ProductB en tantas fábricas (un método por Factory), y la especialización adicional de los pasos de creación se delegará a la jerarquía a medida que se construye. .
fuente
Si creé una clase Factory abstraída (referenciada a través de una interfaz o clase base abstracta) que crea objetos que solo tienen un método para crear objetos, entonces sería un método Factory .
Si la Fábrica abstraída tuviera más de 1 método para crear objetos, entonces sería una Fábrica abstracta .
Digamos que creo un administrador que manejará las necesidades de los métodos de acción para un controlador MVC. Si tuviera un método, por ejemplo, para crear los objetos del motor que se utilizarán para crear modelos de vista, entonces sería un patrón de método de fábrica. Por otro lado, si tuviera dos métodos: uno para crear motores de modelos de vista y otro para crear motores de modelos de acción (o como quiera llamar al modelo que el método de acción contiene consumidores), entonces sería una fábrica abstracta.
fuente
Aunque, han pasado muchos años desde que las personas de StackOverflow cuestionaron este problema de manera similar en otras publicaciones (la más antigua es de 2009), todavía no pude encontrar la respuesta que quería.
Así que hice algunas horas de investigación a través de la web, revisé los ejemplos, y llegué a esta conclusión, las principales diferencias de Abstract Factory con Factory Method son
Los ejemplos contrarios serían
Por lo tanto, cuando un grupo de objetos final debe tener el mismo estilo sin excepción de un objeto y desea ocultar este detalle de "mantener el mismo estilo", entonces debemos usar Abstract Factory.
fuente
Hasta donde entiendo el significado de las definiciones abstractas de fábrica y de método de fábrica, la primera se implementa en contexto estático y proporciona objetos basados en parámetros de entrada.
El segundo usa un objeto ya creado (la familia) que implementa la interfaz del método de fábrica. El método de fábrica crea una instancia específica relacionada con el objeto original, sin importar cuál sea.
Por lo tanto, esto generalmente lleva a usar ambos patrones juntos, donde en el primer paso creas un objeto general que describe la familia de objetos relacionados. Se llama por el método estático método getInstance ("mi apellido"). La implementación de dicho método getInstance decide qué objeto familiar se creará.
Luego llamo al método createProduct () en un objeto familiar recién creado y, dependiendo del objeto familiar, se devolverá el nuevo producto.
Parece que estos patrones cooperan con cada uno.
En otras palabras, Abstract Factory se centra en "QUÉ" se creará y en el método Factory "CÓMO" se creará.
fuente
Todo lo que debe recordar es que una fábrica abstracta es una fábrica que puede devolver varias fábricas . Entonces, si tuviera una AnimalSpeciesFactory, puede devolver fábricas como esta:
Mamalfactory, BirdFactory, Fishfactory, ReptileFactory. Ahora que tiene una única fábrica de AnimalSpeciesFactory, utilizan el patrón de fábrica para crear objetos específicos. Por ejemplo, imagina que obtuviste una ReptileFactory de esta AnimalFactory, entonces podrías ofrecer crear objetos de reptiles como: serpientes, tortugas, objetos de lagartos.
fuente
fuente
El patrón de método de fábrica es un patrón de diseño de creación que trata de crear objetos sin mostrar la clase exacta de objeto que se está creando. Este patrón de diseño básicamente permite que una clase difiera la instanciación a subclases.
El patrón Abstract Factory sirve de encapsulación a un grupo de fábricas individuales sin exponer las clases concretas. En este modelo, se usa una interfaz genérica de una clase de fábrica abstracta para crear el objeto concreto requerido que separa los detalles de la implementación de los objetos de su uso y composición. Este patrón de diseño se usa ampliamente en aplicaciones GUI donde se necesita crear un tipo similar de componentes GUI.
Mientras buscaba en Google, encontré el siguiente blog que explicaba brillantemente ambos patrones de diseño. echar un vistazo a estos
http://simpletechtalks.com/factory-design-pattern/
http://simpletechtalks.com/abstract-factory-design-pattern/
fuente