25 de diciembre de 2021

Diferencias: Simple Factory vs. Factory Method vs. Abstrac Factory



En los tutoriales anteriores vimos tres patrones de diseño que son muy parecidos en nombre y concepto: Simple Factory (conocida también como Factory, a secas), Factory Method y Abstract Factory. La finalidad de los tres patrones es la misma: encapsular la instanciación de objetos. Sin embargo, cada uno de los patrones lo hace de una forma diferente dependiendo del problema que estemos tratando de resolver.

Al tener nombres tan parecidos, estos tres patrones generan mucha confusión entre los desarrolladores.

En este tutorial te explico las diferencias entre estos tres patrones y te doy algunas recomendaciones de cuándo debes usar uno u otro.

Si no conoces ninguno de los tres patrones que menciono en la introducción, es importante que primero leas las definiciones en los artículos respectivos. Hablo de Factory y Factory Method en un tutorial, y de Abstract Factory en otro tutorial.

Este será un tutorial muy corto ya que solo me enfocaré en las diferencias entre estos patrones. Comencemos.


¿Qué tienen en común estos patrones?

  1. Se clasifican como patrones creacionales; o sea, que su objetivo es crear un objeto y regresarlo a la clase que los invoca.
  2. Ocultan la lógica de la instanciación e inicialización. Es a esto a lo que me refiero cuando digo que encapsulan los detalles de la instanciación de objetos.
  3. Todos tienen una clase "Factory" responsable de crear estos nuevos objetos, ya sea por ella misma o delegando esta tarea a una subclase concreta.


¿Cuáles son las diferencias?

Simple FactoryFactory MethodAbstract Factory
Una clase es responsable de crear objetos que extienden de la misma clase base. Define una clase abstracta o interface para que sus subclases creen objetos que extienden de la misma clase base. Define una clase abstracta o interface para que sus subclases creen objetos que pertenecen a una familia de diferentes objetos relacionados entre sí.
Es una clase plana que no implementa ninguna interface ni extiende de ninguna clase abstracta. Los objetos específicos son creados por una o más clases concretas que extienden de la clase abstracta. Es una fábrica de fábricas, los objetos específicos son creados por una o más clases concretas que extienden de la clase abstracta.
La fábrica decide directamente qué objeto concreto crear basado en los parámetros que recibe. La fábrica delega el trabajo de la creación del objeto concreto a una de sus subclases, la cual puede o no hacer uso de un parámetro. Cada fábrica se especializa en crear un tipo de objeto.
Una sola fábrica generalizada es capaz de producir uno o más tipo de objetos. Cada fábrica concreta se especializa en crear solo un tipo concreto de objeto. Una fábrica generalizada contiene una o más fábricas especializadas donde cada una produce un tipo concreto de objeto.
Caso de uso: Crear un objeto para un propósito específico, sin que el tipo concreto del objeto importe y en donde solo hay una forma de crear e inicializar los objetos. Caso de uso: Crear un objeto que tiene muchas dependencias o configuración que debe hacerse al inicializarlo, o en donde hay diferentes formas o algoritmos para crear le objeto. Caso de uso: Crear múltiples objetos de distintos tipos pero que tienen una relación o dependencia con otros; esto es, crear una familia de objetos.

Los diagramas de los patrones también nos pueden ayudar mejor a entender las diferencias entre ellos: 
 
Simple Factory:
 
 
 
Factory Method:
 
 
 
Abstract Factory:
 



 

Conclusión

Como puedes ver, Simple Factory es solo una clase y esta se encarga de decidir qué objeto concreto se creará.

En Factory Method tenemos una clase o interface base para la fábrica y tenemos varias implementaciones de la misma. Cada implementación tiene la responsabilidad de crear los objetos. El tener una clase base para la fábrica nos brinda la flexibilidad para cambiar la fábrica concreta que usamos en cada momento, así podemos tener varias formas de crear los mismos objetos usando una lógica que puede ser diferente. Esto último no es obligatorio, podríamos en nuestra aplicación siempre tener una única fábrica concreta.

En Abstract Factory, a diferencia de los dos patrones anteriores, el objetivo no es crear solo un objeto sino un conjunto o una familia de objetos (objetos que tienen una relación o dependencia entre ellos), por lo que tenemos una fábrica abstracta y varias fábricas concretas. Cada fábrica concreta se encarga de crear los distintos objetos de la familia.

Como vemos, los distintos niveles de abstracción van aumentando en cada una de las tres fábricas anteriores. Toda la explicación he intentado hacerla yendo de la implementación y el concepto más simple hasta el más complicado.

Recuerda que las tres fábricas son patrones de diseño diferentes y que cada una puede, además, tener nombres diferentes. En los respectivos tutoriales puedes ver más información sobre esto.

Y listo, eso es todo. Este fue un tutorial muy corto solo para mostrar las diferencias entre cada uno de estos tres patrones que siempre generan confusión.

Espero que este tutorial les sea de utilidad. Si tienen alguna duda, sugerencia, comentario o aclaración, pueden dejarla en la sección de comentarios o enviar un correo a programadorjavablog@gmail.com (pueden agregarme al chat de gmail). También pueden seguir JavaTutoriales en las siguientes redes sociales: Saludos y gracias.

Entradas relacionadas: