Al estudiar patrones de diseño, hay un punto en el que casi todos nos atascamos alguna vez.
Es el de Factory Method vs Abstract Factory. Los nombres se parecen y ambos «crean objetos por nosotros», así que es fácil confundirlos.
También es una pregunta habitual en entrevistas, así que lo he dejado resumido en este artículo.
Empecemos por lo esencial. Factory Method delega en las subclases la decisión de qué clase usar para crear un objeto. Abstract Factory crea juntos varios objetos relacionados, es decir, una familia de productos.
Un factory estático que pone nombre a la creación, como static func make, es distinto del Factory Method de GoF. Si te interesa el diseño de APIs práctico, conviene distinguirlo primero de Factory Method estático en Swift.
¿Uno o un conjunto? Esa es la diferencia principal.
¿Qué es Factory Method?
Factory Method es un patrón que delega en las subclases la responsabilidad de crear objetos, en lugar de dejarla en la superclase.
La superclase solo define que hay que crear un botón; la subclase decide qué botón crear.
Con código se entiende mucho más rápido.
protocol Button { func render() }
class Dialog {
// Factory Method: la subclase decide qué crear
func createButton() -> Button { fatalError("Implementación en la subclase") }
func render() {
let button = createButton()
button.render()
}
}
class IOSDialog: Dialog {
override func createButton() -> Button { IOSButton() }
}
Dialog no necesita saber qué botón utiliza. Cuando aparece una plataforma nueva, basta con añadir una subclase.
La clave es la herencia: se sustituye el punto de creación mediante subclasificación.
¿En qué se diferencia Abstract Factory?
Abstract Factory es un patrón que crea como conjunto varios objetos relacionados.
No se encarga de un solo botón, sino de objetos que deben ir juntos, como botones, casillas y barras de desplazamiento.
protocol GUIFactory {
func createButton() -> Button
func createCheckbox() -> Checkbox
}
class IOSFactory: GUIFactory {
func createButton() -> Button { IOSButton() }
func createCheckbox() -> Checkbox { IOSCheckbox() }
}
class MacFactory: GUIFactory {
func createButton() -> Button { MacButton() }
func createCheckbox() -> Checkbox { MacCheckbox() }
}
Lo importante es la coherencia. Con una factory de iOS, tanto el botón como la casilla siguen el estilo de iOS. Así se evita mezclar un botón de iOS con una casilla de Mac.
Abstract Factory suele utilizarse inyectando desde fuera el objeto factory. Funciona mediante composición, no mediante herencia.
Factory Method resuelve «qué crear» mediante herencia,
mientras que Abstract Factory resuelve «qué conjunto crear» mediante composición.
Comparación rápida de las diferencias
Como explicarlo con palabras puede confundir, lo he resumido en una tabla.
| Categoría | Factory Method | Abstract Factory |
|---|---|---|
| Objetivo | Delegar la creación de un objeto | Crear una familia de objetos relacionados |
| Base | Herencia (subclasificación) | Composición (configuración) |
| Qué crea | Un tipo de producto | Varios productos (familia) |
| Forma de extensión | Añadir una subclase | Añadir una nueva factory |
| Ejemplo habitual | createButton() | GUIFactory completo |
Lo interesante es que el interior de Abstract Factory suele estar compuesto, en realidad, por Factory Methods. Más que competir, son patrones de distinto alcance.
Cuándo usarlo y cuándo evitarlo
Los criterios prácticos son más sencillos de lo que parecen.
- Si solo hay un tipo de objeto que crear, Factory Method es suficiente. Crear además una interfaz factory sería sobrediseño.
- Si hay dos o más objetos que deben moverse juntos, considera Abstract Factory.
- Si la familia de productos no va a crecer, muchas veces es mejor una simple condición.
| Situación | Decisión |
|---|---|
| Solo se crea un producto | Factory Method |
| Los productos se mueven como conjunto | Abstract Factory |
| La familia de productos crece con frecuencia | Abstract Factory |
| Solo hay 2 o 3 ramas | Condición simple, sin patrón |
Los patrones son herramientas, no objetivos. Añadir abstracciones por adelantado a código que no crecerá solo dificulta su lectura.
En una entrevista pueden preguntarlo así
P. Explique la diferencia entre Factory Method y Abstract Factory. R. Factory Method es un patrón basado en herencia que delega en las subclases la creación de un objeto. Abstract Factory se basa en composición y crea de forma coherente una familia de objetos relacionados. La diferencia clave es si se crea uno o un conjunto.
P. ¿Se utiliza Factory Method dentro de Abstract Factory? R. Sí, con frecuencia. Cada método de creación de Abstract Factory suele implementarse internamente con la forma de un Factory Method. No son conceptos opuestos, sino patrones con distinto alcance.
Si al ver estos dos patrones piensas «¿uno o un conjunto?», ya has captado la idea. Repasa este artículo una vez antes de la entrevista y llegarás con más confianza.

