Veintitrés patrones son demasiados para abordarlos en desorden. Por eso el Gang of Four los organizó en un mapa con dos ejes —el propósito del patrón y su ámbito— que sigue siendo la forma estándar de navegar el catálogo. Esta lección es exactamente eso: el mapa del territorio que recorrerás en los módulos 2, 3 y 4. Verás las tres familias (creacionales, estructurales y de comportamiento), qué pregunta responde cada una, la tabla completa de los 23 patrones con su propósito en una línea, y una mención a las familias que quedaron fuera del GoF y que visitaremos en el módulo 6. No desarrollaremos ningún patrón individual: hoy toca orientarse, no excavar.
Contenido
- Los dos ejes de clasificación del GoF
- Primer eje: el propósito (las tres familias)
- Los 23 patrones, familia a familia
- Segundo eje: el ámbito (clase frente a objeto)
- Más allá del GoF: otras familias de patrones
- El mapa como itinerario del curso
Los dos ejes de clasificación del GoF
El libro Design Patterns clasifica sus 23 patrones con dos criterios ortogonales:
- Propósito (purpose): ¿qué tipo de problema resuelve el patrón? Da lugar a las tres familias: creacionales (cómo se crean los objetos), estructurales (cómo se componen) y de comportamiento (cómo colaboran y se reparten responsabilidades).
- Ámbito (scope): ¿el patrón opera sobre clases (relaciones fijadas en compilación, vía herencia) o sobre objetos (relaciones establecidas en ejecución, vía composición)?
El primer eje es el que todo el mundo usa para hablar de patrones y el que estructura este curso; el segundo es más sutil pero muy revelador, y lo veremos en la sección 4.
Una intuición útil para recordar las tres familias con PideYa: piensa en el ciclo de vida de los objetos de un sistema. Primero hay que crearlos (¿quién hace el new de la pasarela de pago adecuada?), luego organizarlos en estructuras mayores (¿cómo se monta un menú que contiene platos y otros menús?), y finalmente hacerlos colaborar (¿cómo se entera el repartidor de que el pedido cambió de estado?). Creación → estructura → comportamiento.
flowchart LR
A[Creacionales<br/>¿Cómo nacen los objetos?] --> B[Estructurales<br/>¿Cómo se componen?]
B --> C[De comportamiento<br/>¿Cómo colaboran?]
A -.-> M2[Módulo 2]
B -.-> M3[Módulo 3]
C -.-> M4[Módulo 4]
Primer eje: el propósito (las tres familias)
Patrones creacionales (5 patrones → módulo 2)
Pregunta que responden: ¿cómo crear objetos sin que el código quede acoplado a las clases concretas que instancia, y cómo controlar cuántas instancias existen y cómo se montan las complejas?
Como vimos al estudiar los principios de diseño, el new es el punto donde inevitablemente se nombra una clase concreta. Los creacionales existen para aislar y centralizar esos puntos, de modo que el resto del sistema programe contra interfaces. En PideYa, son los patrones que responderán a "¿quién decide si el pago se procesa con la pasarela de tarjeta o con PayPal?" o "¿cómo se construye un pedido con líneas, descuentos, dirección y propina sin un constructor de diez parámetros?".
Patrones estructurales (7 patrones → módulo 3)
Pregunta que responden: ¿cómo combinar clases y objetos en estructuras mayores que sigan siendo flexibles y eficientes?
Son los patrones de la composición: envolver un objeto para añadirle algo, adaptar una interfaz ajena a la que tu código espera, tratar igual a un elemento y a un grupo de elementos, o dar una fachada simple a un subsistema enrevesado. En PideYa aparecerán cuando integremos la API de un proveedor externo de pagos que no encaja con nuestras interfaces, o cuando modelemos cartas que contienen secciones que contienen platos.
Patrones de comportamiento (11 patrones → módulo 4)
Pregunta que responden: ¿cómo repartir responsabilidades entre objetos y organizar la comunicación entre ellos para que cada uno haga lo suyo sin acoplarse al resto?
Es la familia más numerosa, porque la colaboración es lo más difícil de diseñar. Aquí viven los patrones que resuelven el problema de las notificaciones de Pedido que vimos en la primera lección, los que modelan el ciclo de estados de un pedido (recibido → en preparación → en reparto → entregado) y los que permiten intercambiar algoritmos (estrategias de cálculo de gastos de envío) en tiempo de ejecución.
Los 23 patrones, familia a familia
Aquí tienes el catálogo completo. No intentes memorizarlo hoy: úsalo como índice al que volver. Cada patrón tiene su lección propia en los módulos 2–4.
Creacionales (módulo 2)
| Patrón | Propósito en una línea |
|---|---|
| Singleton | Garantizar que una clase tenga una única instancia, con acceso global a ella |
| Factory Method | Delegar en subclases la decisión de qué clase concreta instanciar |
| Abstract Factory | Crear familias completas de objetos relacionados sin nombrar sus clases concretas |
| Builder | Construir objetos complejos paso a paso, separando la construcción de la representación |
| Prototype | Crear objetos nuevos clonando instancias prototipo existentes |
Estructurales (módulo 3)
| Patrón | Propósito en una línea |
|---|---|
| Adapter | Convertir la interfaz de una clase en otra que el cliente espera |
| Bridge | Desacoplar una abstracción de su implementación para que ambas varíen por separado |
| Composite | Componer objetos en árboles y tratar igual a objetos individuales y a composiciones |
| Decorator | Añadir responsabilidades a un objeto dinámicamente, envolviéndolo |
| Facade | Ofrecer una interfaz unificada y simple a un subsistema complejo |
| Flyweight | Compartir eficientemente muchos objetos de grano fino con estado común |
| Proxy | Proporcionar un sustituto de otro objeto para controlar el acceso a él |
De comportamiento (módulo 4)
| Patrón | Propósito en una línea |
|---|---|
| Chain of Responsibility | Pasar una petición por una cadena de manejadores hasta que uno la atienda |
| Command | Encapsular una petición como objeto, permitiendo colas, registros y deshacer |
| Interpreter | Definir la gramática de un mini-lenguaje y un intérprete para evaluarla |
| Iterator | Recorrer los elementos de una colección sin exponer su representación interna |
| Mediator | Centralizar en un objeto la comunicación entre un grupo de objetos |
| Memento | Capturar y restaurar el estado interno de un objeto sin violar su encapsulación |
| Observer | Notificar automáticamente a múltiples objetos los cambios de estado de otro |
| State | Permitir que un objeto cambie de comportamiento cuando cambia su estado interno |
| Strategy | Encapsular algoritmos intercambiables y hacerlos sustituibles en ejecución |
| Template Method | Fijar el esqueleto de un algoritmo dejando pasos concretos a las subclases |
| Visitor | Añadir operaciones nuevas a una jerarquía de objetos sin modificar sus clases |
Recuento: 5 + 7 + 11 = 23. Como referencia de importancia práctica: no todos pesan igual en el día a día. Singleton, Factory Method, Builder, Adapter, Decorator, Facade, Observer, Strategy, Template Method y Command aparecen constantemente; Interpreter o Flyweight son mucho más ocasionales. En las lecciones de cada patrón y en las comparativas de cierre de cada módulo (02-07, 03-09, 04-13) matizaremos este peso relativo.
Segundo eje: el ámbito (clase frente a objeto)
El segundo criterio del GoF pregunta cómo establece el patrón sus relaciones:
- Ámbito de clase: la relación clave se fija mediante herencia, en tiempo de compilación. Una vez compilado, el comportamiento está decidido.
- Ámbito de objeto: la relación clave se establece mediante composición: referencias entre objetos que pueden cambiarse en tiempo de ejecución.
| Familia | Ámbito de clase | Ámbito de objeto |
|---|---|---|
| Creacionales | Factory Method | Abstract Factory, Builder, Prototype, Singleton |
| Estructurales | Adapter (variante de clase) | Adapter (variante de objeto), Bridge, Composite, Decorator, Facade, Flyweight, Proxy |
| De comportamiento | Interpreter, Template Method | Chain of Responsibility, Command, Iterator, Mediator, Memento, Observer, State, Strategy, Visitor |
Dos observaciones valiosas de esta tabla:
- La inmensa mayoría de patrones son de ámbito de objeto. Es la máxima "favorece la composición sobre la herencia" hecha estadística: de 23 patrones, solo un puñado se apoya en herencia como mecanismo central.
- Hay parejas de patrones que resuelven problemas parecidos, uno por clase y otro por objeto (lo verás, por ejemplo, entre Template Method y Strategy, o entre las dos variantes de Adapter). Comprender el eje de ámbito te dará el criterio para elegir: la herencia es más simple pero rígida; la composición, más flexible pero con más piezas.
Más allá del GoF: otras familias de patrones
El mapa del GoF cubre el diseño de clases y objetos dentro de una aplicación orientada a objetos. Como vimos en la lección de historia, la comunidad siguió cosechando patrones en otros niveles. Las familias que conviene tener en el radar:
- Patrones arquitectónicos: deciden la forma global del sistema, no de unas clases (capas, MVC, microkernel, broker...). Operan a una escala mayor que el GoF.
- Patrones de concurrencia: coordinan hilos y recursos compartidos (productor-consumidor, thread pool, reactor...).
- Patrones de empresa e integración: persistencia, transacciones y mensajería entre sistemas (Repository, Unit of Work, colas y canales...).
- Patrones de microservicios y sistemas distribuidos: resiliencia y coordinación entre servicios remotos (API Gateway, Circuit Breaker, Saga...).
Todas estas familias se tratan en el módulo 6 (arquitecturas modernas, microservicios, sistemas distribuidos y concurrencia); aquí basta con que sitúes cada una en su escala:
flowchart TB
subgraph Escala
A["Arquitectónicos<br/>(forma del sistema)"] --> B["GoF: diseño OO<br/>(clases y objetos)"]
B --> C["Idiomáticos<br/>(trucos propios de un lenguaje)"]
end
D["Transversales por dominio:<br/>concurrencia, empresa,<br/>integración, distribuidos"] -.-> A
D -.-> B
El mapa como itinerario del curso
Esta clasificación no es solo teoría: es literalmente el índice de lo que viene. Tu itinerario:
| Etapa | Familia | Dónde | Qué sabrás al terminar |
|---|---|---|---|
| 1 | Creacionales | Módulo 2 | Crear objetos sin acoplarte a clases concretas |
| 2 | Estructurales | Módulo 3 | Componer objetos en estructuras flexibles |
| 3 | De comportamiento | Módulo 4 | Diseñar colaboraciones desacopladas |
| 4 | Aplicación y criterio | Módulo 5 | Elegir patrón, refactorizar y evitar antipatrones |
| 5 | Familias modernas | Módulo 6 | Arquitectura, microservicios, distribuidos y concurrencia |
Cada módulo de patrones sigue además el mismo ritmo: una introducción a la familia, una lección por patrón (con el problema planteado en PideYa) y una comparativa final para elegir entre patrones parecidos. El orden creacionales → estructurales → de comportamiento no es casual: replica el ciclo natural crear → componer → colaborar, y cada familia se apoya en las anteriores.
Errores Comunes y Consejos
- Intentar memorizar los 23 de golpe. Es inútil y desmoralizante. Hoy solo necesitas las tres preguntas de familia (¿creación? ¿estructura? ¿colaboración?) y saber que la tabla existe para consultarla.
- Tratar la familia como un cajón rígido. Algunos patrones tienen un pie en dos mundos y en la práctica se combinan constantemente (una fábrica que devuelve estrategias, un composite recorrido por un visitor). La clasificación orienta; no encierra.
- Ignorar el eje de ámbito. Casi todo el mundo conoce las tres familias y casi nadie el eje clase/objeto, que es justo el que explica por qué existen parejas de patrones "gemelos" y cuál elegir. Tenerlo presente te dará ventaja en los módulos 3 y 4.
- Creer que el mapa GoF es todo el territorio. Si solo conoces los 23, intentarás resolver con ellos problemas que pertenecen a otra escala (arquitectura, distribución, concurrencia). Parte del criterio es saber cuándo tu problema ni siquiera es de esta familia; el módulo 6 existe para eso.
- Consejo: imprime o guarda las tres tablas de la sección 3. Volver a ellas tras estudiar cada patrón ("¿sigo de acuerdo con esta línea de resumen?") es una técnica de repaso excelente: cuando todas las líneas te parezcan obvias, dominarás el catálogo.
Ejercicios
Ejercicio 1: clasificar problemas de PideYa
Para cada problema, indica qué familia de patrones (creacional, estructural o de comportamiento) lo abordaría. No nombres patrones concretos: razona solo por la naturaleza del problema.
- Cuando un pedido pasa a "entregado", deben enterarse el cliente, el sistema de fidelización y las estadísticas.
- El proveedor externo de mapas tiene una API con métodos y tipos que no encajan con las interfaces de rutas de PideYa.
- Montar un objeto
Pedidoválido exige combinar carrito, dirección, franja horaria, descuentos y propina, con muchas combinaciones opcionales. - La carta de un restaurante contiene secciones, que contienen platos o sub-secciones, y hay que calcular precios y alérgenos sobre el conjunto.
- Según el país, PideYa debe usar un juego completo y coherente de: pasarela de pago, calculadora de impuestos y formateador de tiques.
Ejercicio 2: el eje de ámbito
Sin conocer aún los patrones, razona: ¿por qué un patrón de ámbito de objeto permite cambiar el comportamiento en tiempo de ejecución y uno de ámbito de clase no? Ilústralo con el ejemplo del Repartidor y su Vehiculo de la lección de principios.
Ejercicio 3: ¿GoF o otra familia?
Indica si cada problema pertenece al territorio del GoF o a otra familia de patrones (arquitectónica, concurrencia, distribuidos/empresa):
- Decidir si PideYa se estructura como monolito en capas o como microservicios.
- Evitar que dos hilos que procesan pagos simultáneos corrompan el saldo del monedero.
- Hacer que la clase
Pedidono conozca los detalles de los canales de notificación. - Reintentar y aislar las llamadas al servicio externo de pagos cuando este se degrada.
Soluciones
Solución 1:
- De comportamiento: es un problema de comunicación/colaboración entre objetos (notificar cambios sin acoplarse).
- Estructural: hay que hacer encajar interfaces incompatibles componiendo/envolviendo objetos existentes.
- Creacional: el problema es cómo construir un objeto complejo con muchas variantes.
- Estructural: es una composición de objetos en árbol tratando uniformemente partes y conjuntos.
- Creacional: hay que crear familias coherentes de objetos relacionados según una condición (el país).
Solución 2: en un patrón de ámbito de clase, la relación se establece por herencia: qué comportamiento tiene cada clase queda decidido al compilar, y un objeto no puede cambiar de clase una vez creado. En uno de ámbito de objeto, la relación es una referencia a otro objeto, y una referencia se puede reasignar en cualquier momento. Con el ejemplo: si modelamos RepartidorEnMoto extends Repartidor, un repartidor "es" de moto para siempre (habría que destruir el objeto y crear otro). Si Repartidor tiene un Vehiculo, basta repartidor.asignarVehiculo(new Bicicleta()) a mitad de turno: el comportamiento (tiempos de entrega) cambia en caliente sin cambiar de objeto.
Solución 3:
- Arquitectónica: decide la forma global del sistema, una escala por encima del diseño de clases (módulo 6).
- Concurrencia: coordinación de hilos y estado compartido (módulo 6).
- GoF: diseño de colaboración entre clases dentro de la aplicación (módulo 4).
- Distribuidos/microservicios: resiliencia frente a servicios remotos degradados (módulo 6).
Conclusión
Ya tienes el mapa completo: dos ejes de clasificación (propósito y ámbito), tres familias con su pregunta característica —creacionales: ¿cómo nacen los objetos?; estructurales: ¿cómo se componen?; de comportamiento: ¿cómo colaboran?—, la tabla de los 23 patrones del GoF como índice de consulta, y la ubicación de las familias modernas (arquitectura, concurrencia, empresa, distribuidos) que esperan en el módulo 6. También sabes leer el detalle que casi todos pasan por alto: el eje clase/objeto, que explica por qué la composición domina el catálogo.
Antes de lanzarnos al primer patrón queda una última parada, quizá la que más madurez profesional aporta: pesar honestamente lo que los patrones dan y lo que cuestan, y aprender a decidir cuándo usarlos y cuándo no. Es la lección que cierra este módulo: Ventajas y Desventajas de Usar Patrones de Diseño.
Curso de Patrones de Diseño de Software
Módulo 1: Introducción a los Patrones de Diseño
- ¿Qué son los Patrones de Diseño?
- Historia y Origen de los Patrones de Diseño
- Principios de Diseño: SOLID y Otros Fundamentos
- UML Esencial para Entender Patrones
- Clasificación de los Patrones de Diseño
- Ventajas y Desventajas de Usar Patrones de Diseño
Módulo 2: Patrones Creacionales
- Introducción a los Patrones Creacionales
- Singleton
- Factory Method
- Abstract Factory
- Builder
- Prototype
- Comparativa y Elección de Patrones Creacionales
Módulo 3: Patrones Estructurales
- Introducción a los Patrones Estructurales
- Adapter
- Bridge
- Composite
- Decorator
- Facade
- Flyweight
- Proxy
- Comparativa y Elección de Patrones Estructurales
Módulo 4: Patrones de Comportamiento
- Introducción a los Patrones de Comportamiento
- Chain of Responsibility
- Command
- Interpreter
- Iterator
- Mediator
- Memento
- Observer
- State
- Strategy
- Template Method
- Visitor
- Comparativa y Elección de Patrones de Comportamiento
Módulo 5: Aplicación de Patrones de Diseño
- Cómo Seleccionar el Patrón Adecuado
- Ejemplos Prácticos de Uso de Patrones
- Patrones de Diseño en Proyectos Reales
- Refactorización Usando Patrones de Diseño
- Antipatrones: Cuándo los Patrones se Vuelven un Problema
Módulo 6: Patrones de Diseño Avanzados
- Patrones de Diseño en Arquitecturas Modernas
- Patrones de Diseño en Microservicios
- Patrones de Diseño en Sistemas Distribuidos
- Patrones de Concurrencia
- Patrones de Diseño en Desarrollo Ágil
