¿Alguna vez has cambiado toda la interfaz de una app de claro a oscuro?
Al sustituir los colores de botones y etiquetas uno por uno, siempre se escapa algo. Es fácil acabar con un botón de fondo negro y una etiqueta que conserva el fondo blanco.
Aquí encaja perfectamente el patrón Abstract Factory de Swift. Agrupa los objetos relacionados en un conjunto y sustituye el conjunto completo.
El patrón que cambia el punto de creación de un objeto y el que crea toda una familia de productos tienen alcances distintos. Si quieres delimitar primero esa frontera, consulta también Diferencias entre Factory Method y Abstract Factory.
En este artículo resumimos qué resuelve exactamente Abstract Factory, cómo sustituir objetos relacionados de una vez con código Swift y cuándo conviene usarlo o evitarlo.
¿Qué es el patrón Abstract Factory?
En una frase:
Es un patrón que permite sustituir, según la situación, la fábrica completa que crea como conjunto objetos que deben ser compatibles.
La clave son los “objetos que deben usarse juntos”. Mezclar un botón de tema oscuro con un fondo de tema claro sería problemático.
Abstract Factory evita estos errores de composición.
Al elegir una fábrica, sus piezas son compatibles automáticamente. Si eliges la fábrica clara, obtienes un botón, una etiqueta y un fondo claros.
No eliges las piezas individualmente; eliges la fábrica completa.
Eso es todo Abstract Factory.
Cómo sustituir objetos relacionados de una vez en Swift
Con código real resulta mucho más claro. Usemos los temas de UI como ejemplo.
Primero define las especificaciones (protocolos) de las piezas que se crearán y de la fábrica que las producirá.
protocol Button { func render() -> String }
protocol Label { func render() -> String }
// La fábrica se encarga del conjunto completo de piezas compatibles
protocol ThemeFactory {
func makeButton() -> Button
func makeLabel() -> Label
}
Ahora crea una fábrica para el tema claro y otra para el oscuro. Cada fábrica produce solo piezas que coinciden con su tema.
struct LightFactory: ThemeFactory {
func makeButton() -> Button { LightButton() }
func makeLabel() -> Label { LightLabel() }
}
struct DarkFactory: ThemeFactory {
func makeButton() -> Button { DarkButton() }
func makeLabel() -> Label { DarkLabel() }
}
La parte que dibuja la pantalla solo necesita recibir una fábrica. No le importa cuál sea.
func buildScreen(with factory: ThemeFactory) {
let button = factory.makeButton()
let label = factory.makeLabel()
print(button.render(), label.render())
}
// Cambiar el tema solo requiere modificar una línea de la fábrica
buildScreen(with: DarkFactory())
En cuanto sustituyes LightFactory() por DarkFactory(), el botón y la etiqueta pasan juntos al tema oscuro.
Ya no tienes que corregir por separado el color del botón y el de la etiqueta.
¿En qué se diferencia de Factory Method?
Como los nombres se parecen y es fácil confundirlos, aclaremos la diferencia.
| Distinción | Factory Method | Abstract Factory |
|---|---|---|
| Qué crea | Un tipo de objeto | Varios tipos de objetos relacionados (un conjunto) |
| Enfoque | “¿Qué crear?” | “Agrupar los que son compatibles” |
| Ejemplo típico | Crear un botón | Un botón, una etiqueta y un fondo como conjunto |
En resumen, Factory Method es una forma de crear una pieza, mientras que Abstract Factory agrupa esas piezas en un conjunto.
También puedes pensar que Abstract Factory utiliza varios Factory Method en su interior.
Cuándo usarlo y cuándo evitarlo
Después de usarlo, comprobé que hay una clara diferencia entre los casos adecuados y aquellos en los que resulta excesivo.
Cuándo encaja bien
- Cuando está claro que el cambio se realiza por “conjuntos”, como temas, plataformas o países
- Cuando hay que sustituir toda una familia de componentes de UI, como entre iOS y macOS
- Cuando los métodos de pago o los controladores de bases de datos se sustituyen por conjuntos completos
Cuándo resulta excesivo
- Cuando solo hay que crear uno o dos tipos de objetos
- Cuando las reglas de composición cambian con frecuencia y el conjunto no es estable
Si solo existe un objeto y construyes un Abstract Factory, el código aumenta y resulta más difícil de leer.
Conviene usarlo cuando haya una razón clara para agrupar objetos en un conjunto.
Dos preguntas frecuentes
P. ¿Y si quiero añadir otro tipo de pieza más adelante?
Debes añadir un método al protocolo e implementarlo en todas las fábricas. Si hay muchas fábricas, requiere bastante trabajo; por eso conviene anticiparlo en proyectos donde los tipos de piezas crezcan con frecuencia.
P. ¿También se usa con SwiftUI?
Por supuesto, pero SwiftUI ya ofrece mecanismos de inyección propios como Environment y @Observable, que suelen ser más concisos para los temas. Abstract Factory brilla más con UIKit o cuando una capa de lógica pura necesita sustituir conjuntos completos.
Abstract Factory es, en definitiva, el patrón que agrupa bajo un mismo control las cosas que no deben funcionar por separado.
Cuando pruebes la experiencia de que toda la pantalla encaje al cambiar el tema en una sola línea, entenderás de inmediato por qué se usa este patrón. Te recomiendo empezar trasladando un ejemplo pequeño a código.

