Diseño de software

Patrón Abstract Factory en Swift: sustituir objetos relacionados de una vez

Abstract Factory agrupa varios objetos compatibles en familias de productos y los sustituye de una sola vez. Con un ejemplo de temas en Swift, explica cómo evitar errores de composición y cuándo elegirlo frente a Factory Method.

4 min de lectura
Imagen de portada de Patrón Abstract Factory en Swift: sustituir objetos relacionados de una vez

¿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
}
Todo empieza por definir un protocol
Todo empieza por definir un protocol

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.

Elige una fábrica y las piezas llegan automáticamente como un conjunto
Elige una fábrica y las piezas llegan automáticamente como un conjunto
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.

De claro a oscuro: cambias una línea y la pantalla encaja por completo
De claro a oscuro: cambias una línea y la pantalla encaja por completo

¿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.

Artículos relacionados