Estaba leyendo patrones de diseño de un sitio web
Allí leí sobre Fábrica, Método de fábrica y Fábrica abstracta, pero son tan confusos que no tengo clara la definición. De acuerdo con las definiciones
Fábrica: crea objetos sin exponer la lógica de creación de instancias al cliente y hace referencia al objeto recién creado a través de una interfaz común. Es una versión simplificada del Método Factory
Método de fábrica: define una interfaz para crear objetos, pero permite que las subclases decidan qué clase instanciar y se refiere al objeto recién creado a través de una interfaz común.
Abstract Factory: ofrece la interfaz para crear una familia de objetos relacionados, sin especificar explícitamente sus clases.
También miré los otros hilos de stackoverflow con respecto a Abstract Factory vs Factory Method, pero los diagramas UML dibujados allí hacen que mi comprensión sea aún peor.
¿Alguien puede decirme?
- ¿En qué se diferencian estos tres patrones entre sí?
- ¿Cuándo usar cuál?
- Y también, si es posible, ¿hay ejemplos de Java relacionados con estos patrones?
fuente
Respuestas:
Los tres tipos de Fábrica hacen lo mismo: son un "constructor inteligente".
Digamos que desea poder crear dos tipos de fruta: manzana y naranja.
Fábrica
Factory es "fijo", ya que solo tiene una implementación sin subclases. En este caso, tendrá una clase como esta:
Caso de uso: la construcción de una manzana o una naranja es demasiado compleja para manejarla en el constructor.
Método de la fábrica
El método de fábrica generalmente se usa cuando tienes un procesamiento genérico en una clase, pero quieres variar qué tipo de fruta realmente usas. Entonces:
... entonces puede reutilizar la funcionalidad común
FruitPicker.pickFruit()
implementando un método de fábrica en subclases:Fábrica abstracta
La fábrica abstracta normalmente se usa para cosas como la inyección / estrategia de dependencia, cuando se quiere poder crear una familia completa de objetos que necesitan ser "del mismo tipo" y tener algunas clases base comunes. Aquí hay un ejemplo vagamente relacionado con la fruta. El caso de uso aquí es que queremos asegurarnos de que no usamos accidentalmente un OrangePicker en una Apple. Siempre que obtengamos nuestra Fruta y Recogedor de la misma fábrica, coincidirán.
fuente
Fábrica: Crea objetos sin exponer la lógica de instanciación al cliente.
Método de fábrica: defina una interfaz para crear un objeto, pero deje que las subclases decidan qué clase instanciar. El método Factory permite que una clase difiera la creación de instancias en subclases
Abstract Factory: proporciona una interfaz para crear familias de objetos relacionados o dependientes sin especificar sus clases concretas.
El patrón AbstractFactory usa la composición para delegar la responsabilidad de crear objetos a otra clase, mientras que el patrón de diseño del método Factory usa la herencia y se basa en la clase derivada o subclase para crear el objeto
Fábrica: el cliente solo necesita una clase y no le importa qué implementación concreta esté obteniendo.
Método de fábrica: el cliente no sabe qué clases concretas se requerirán para crear en tiempo de ejecución, pero solo quiere obtener una clase que haga el trabajo.
AbstactFactory: cuando su sistema tiene que crear varias familias de productos o si desea proporcionar una biblioteca de productos sin exponer los detalles de implementación.
Las clases Abstract Factory a menudo se implementan con el Método Factory. Los métodos de fábrica generalmente se llaman dentro de los métodos de plantilla.
Factory y FactoryMethod
Intención:
Defina una interfaz para crear un objeto, pero permita que las subclases decidan qué clase instanciar. Factory Method permite que una clase difiera la creación de instancias en subclases.
Diagrama UML :
Producto: define una interfaz de los objetos que crea el método Factory.
ConcreteProduct: implementa la interfaz del producto
Creador: declara el método Factory
ConcreateCreator: implementa el método Factory para devolver una instancia de un ConcreteProduct
Planteamiento del problema: cree una Fábrica de juegos utilizando los Métodos de fábrica, que definen la interfaz del juego.
Fragmento de código:
Patrón de fábrica ¿Cuándo usar los métodos de fábrica?
Comparación con otros patrones de creación:
El diseño comienza con el Método Factory (menos complicado, más personalizable, proliferan las subclases) y evoluciona hacia Abstract Factory, Prototype o Builder (más flexible, más complejo) a medida que el diseñador descubre dónde se necesita más flexibilidad
Las clases de Fábrica abstracta a menudo se implementan con Métodos de fábrica , pero también se pueden implementar utilizando Prototype
Referencias para lecturas adicionales: patrones de diseño de creación de código fuente
fuente
Factory : clase Factory separada para crear objetos complejos.
Ej: clase FruitFactory para crear objeto de Fruit
Método de fábrica : en lugar de toda una clase separada para la fábrica, simplemente agregue un método en esa clase como fábrica.
Ex:
Método de Fábrica Abstracta - Fábrica de Fábrica
Ej: Digamos que queremos construir una fábrica para partes de computadoras. Así que hay varios tipos de computadoras como Laptop, Desktop, Server.
Entonces, para cada tipo de compilador necesitamos fábrica. Entonces creamos una fábrica de fábricas de alto nivel como la siguiente
Ahora estos 3 en sí mismos son de nuevo fábricas. (Se ocupará de PartFactory en sí, pero bajo el capó, habrá una implementación separada basada en lo que proporcionó en la fábrica abstracta)
EDITAR: editado para proporcionar interfaces exactas para Abstract Factory según las objeciones en los comentarios.
fuente
ComputerFactory
esto sería que tiene una interfaz de creación común (getScreen(); getKeyboard(); getDiskdrive(); ...
), no una interfaz por tipo de computadora como sugiere. Puede oler un problema de diseño si usa la misma palabra dos veces en la misma declaración: Laptop Factory.get Laptop Part ().abstract Factory
, no es una fábrica de la fábrica ... Es unabstract class
o uninterface
poder crear el objeto que será implementado / extendida con distintas fábricas de hormigón. Consulte la respuesta aceptada para obtener detalles del código. Y elimine o edite su respuesta en consecuencia.Cada patrón de diseño prospera para ayudar a garantizar que no se toque el código de trabajo escrito. Todos sabemos que una vez que tocamos el código de trabajo, hay defectos en los flujos de trabajo existentes, y es necesario realizar muchas más pruebas para garantizar que no hayamos roto nada.
Un patrón de fábrica crea objetos basados en criterios de entrada, asegurando así que no necesite escribir código como si fuera así, luego cree este tipo de objeto o este tipo de objeto. Un buen ejemplo de esto es un sitio web de viajes. Un sitio web de viajes solo puede proporcionar viajes (vuelo, tren, autobús) o / y proporcionar hoteles o / y proporcionar paquetes de atracciones turísticas. Ahora, cuando un usuario selecciona a continuación, el sitio web necesita decidir qué objetos necesita crear. Si solo crea el objeto de viaje u hotel también.
Ahora, si imagina agregar otro sitio web a su cartera, y cree que se usará el mismo núcleo, por ejemplo, un sitio web de viajes compartidos, que ahora busca taxis y realiza pagos en línea, puede usar una fábrica abstracta en su núcleo. De esta manera, puede instalar una fábrica más de taxis y vehículos compartidos.
Ambas fábricas no tienen nada que ver entre sí, por lo que es un buen diseño para mantenerlas en fábricas diferentes.
Espero que esto esté claro ahora. Estudie el sitio web nuevamente teniendo en cuenta este ejemplo, con suerte le ayudará. Y realmente espero haber representado los patrones correctamente :).
fuente
Para esta respuesta, me refiero al libro "Gang of Four".
No hay definiciones de "Fábrica" ni de "Fábrica simple" ni de "Fábrica virtual" en el libro. Por lo general, cuando las personas hablan sobre el patrón "Factory", pueden estar hablando sobre algo que crea un objeto particular de una clase (pero no el patrón "constructor"); que puede o no puede hacer referencia a la "Factory Method" o "patrones Resumen de fábrica". Cualquiera puede implementar "Fábrica" como no lo hará porque no es un término formal (tenga en cuenta que algunas personas, empresas y comunidades pueden tener su propio vocabulario).
El libro solo contiene definiciones para "Fábrica abstracta" y "Método de fábrica".
Aquí hay definiciones del libro y una breve explicación de por qué ambos pueden ser tan confusos. Omito ejemplos de código porque puedes encontrarlos en otras respuestas:
Método de fábrica (GOF) : defina una interfaz para crear un objeto, pero permita que las subclases decidan qué clase instanciar. Factory Method permite que una clase difiera la creación de instancias en subclases.
Abstract Factory (GOF) : proporciona una interfaz para crear familias de objetos relacionados o dependientes sin especificar sus clases concretas.
Fuente de confusión : a menudo, se puede llamar a una clase que se usa en el patrón "Método de fábrica" como "Fábrica". Esta clase es abstracta por definición. Por eso es fácil llamar a esta clase "Fábrica abstracta". Pero es solo el nombre de la clase; no debe confundirlo con el patrón "Abstract Factory" (nombre de clase! = nombre del patrón). El patrón "Fábrica abstracta" es diferente: no utiliza una clase abstracta; define una interfaz (no necesariamente una interfaz de lenguaje de programación) para crear partes de un objeto más grande u objetos que están relacionados entre sí o deben crearse de una manera particular.
fuente
Usando el Método de Fábrica, el usuario puede crear A1 o A2 de AbstractProductA.
Pero Abstract Factory tiene más de 1 método de fábrica (por ejemplo: 2 métodos de fábrica), utilizando esos métodos de fábrica creará el conjunto de objetos / objetos relacionados. Usando Abstract Factory, el usuario puede crear objetos A1, B1 de AbstractProductA, AbstractProductB
fuente
Nadie ha citado el libro original Design Patterns: Elements of Reusable Object-Oriented Software , que da la respuesta en los primeros dos párrafos de la sección "Discusión de los patrones creacionales" (énfasis mío):
fuente