🚨 ¡Nueva review! ✨ Mi ratón favorito para programar: el Logitech MX Master 3S . ¡Échale un ojo! 👀

Patrones de diseño

¿Qué son los patrones de diseño?

Escrito por domin el 8 de septiembre de 2025 · Actualizado el 8 de febrero de 2026

🧩 Patrones de diseño

¿Qué son?

Los patrones de diseño son soluciones probadas a problemas que aparecen una y otra vez cuando diseñas software. No es código que copias y pegas. Es más bien una receta: te dice los ingredientes, los pasos y el resultado esperado, pero tú la adaptas a tu cocina.

Los definieron cuatro tipos (conocidos como la Gang of Four o GoF) en 1994, en el libro que sigue siendo la biblia del tema. Desde entonces, la industria entera los usa como vocabulario común.

Dicho en cristiano: un patrón de diseño es una forma inteligente de resolver un problema que ya ha resuelto mucha gente antes que tú. No reinventes la rueda.

Diagrama con los 23 patrones de diseño del catálogo GoF agrupados por tipo: creacionales, estructurales y de comportamiento.

¿Y por qué tendría que usarlos?

Porque estos prototipos han sido implementados miles de veces en proyectos reales. Son garantía de que tu código acabe siendo:

Y esto último es clave: los patrones te dan un lenguaje común. Cuando dices “aquí uso un Factory Method”, tu compañero de equipo ya sabe la estructura, las ventajas y las limitaciones. No hace falta explicar cada decisión desde cero.


El libro: la biblia de los patrones

Todo viene de Design Patterns: Elements Of Reusable Object-Oriented Software (1994), escrito por Erich Gamma, Richard Helm, Ralph Johnson y John Vlissides. Definieron 23 patrones agrupados en tres categorías. Sigue siendo referencia obligada, aunque hoy en día hay muchos más recursos (y más digeribles) para aprenderlos.


Los tres tipos de patrones

Según el catálogo GoF, los patrones se agrupan en tres categorías según el tipo de problema que resuelven:

Creacionales

Se ocupan de cómo se crean los objetos. Ocultan la lógica de instanciación para que tu código no dependa de clases concretas. Ejemplo: necesitas crear objetos sin saber exactamente qué tipo serán hasta tiempo de ejecución.

Estructurales

Se ocupan de cómo se componen las clases y objetos para formar estructuras más grandes. Ejemplo: necesitas que dos interfaces incompatibles trabajen juntas, o simplificar el acceso a un subsistema complejo.

De comportamiento

Se ocupan de cómo se comunican los objetos entre sí y cómo se reparten responsabilidades. Ejemplo: necesitas que varios objetos reaccionen cuando otro cambia de estado, sin acoplamiento directo.


Patrones creacionales

Centrados en el proceso de crear objetos. Ocultan la lógica de instanciación y te dan flexibilidad para decidir qué se crea, cómo y cuándo.

Patrón¿Qué hace?Caso típico
SingletonGarantiza que una clase tenga una única instancia en toda la aplicaciónConexión a base de datos, logger, configuración global
Factory MethodDelega la creación de objetos a subclases, sin especificar la clase exactaCrear notificaciones (email, SMS, push) según el contexto
Abstract FactoryCrea familias de objetos relacionados sin depender de clases concretasUI multiplataforma (botones, inputs, modales de Windows vs macOS)
BuilderConstruye objetos complejos paso a pasoGenerar consultas SQL, construir informes PDF, configurar objetos con muchos parámetros
PrototypeCrea objetos clonando instancias existentesDuplicar configuraciones, clonar documentos, copiar estados de juego

Patrones estructurales

Se enfocan en cómo se componen las clases y objetos para formar estructuras más grandes y flexibles.

Patrón¿Qué hace?Caso típico
AdapterHace que interfaces incompatibles trabajen juntasIntegrar un servicio de pago antiguo con tu API moderna
DecoratorAñade funcionalidad extra a un objeto dinámicamenteAñadir logging, caché o compresión a un servicio sin modificarlo
CompositeTrata objetos individuales y grupos de forma uniformeMenús con submenús, carpetas con archivos, organigramas
FacadeProporciona una interfaz simple a un subsistema complejoUn método procesarPedido() que por dentro llama a stock, pago, envío y email
ProxyProporciona un sustituto que controla el acceso a otro objetoLazy loading de imágenes, control de permisos, caché transparente
BridgeSepara una abstracción de su implementaciónNotificaciones (urgente/normal) por diferentes canales (email/SMS/Slack)
FlyweightMinimiza el uso de memoria compartiendo datos comunesRenderizar miles de árboles en un videojuego, caracteres en un editor de texto

Patrones de comportamiento

Se centran en la comunicación entre objetos y en cómo se reparten las responsabilidades.

Patrón¿Qué hace?Caso típico
ObserverDefine una dependencia uno-a-muchos: cuando un objeto cambia, los demás se enteranNotificaciones en tiempo real, eventos de un blog, listeners del DOM
StrategyDefine una familia de algoritmos intercambiablesMétodos de pago (PayPal, tarjeta, Bizum), cálculo de envío
CommandEncapsula una petición como un objetoUndo/Redo en editores, colas de tareas, transacciones
InterpreterDefine una gramática y la interpretaEvaluar expresiones matemáticas, parsear reglas de negocio, SQL simplificado
StateUn objeto cambia de comportamiento según su estado internoPedidos (pendiente→pagado→enviado), reproductor multimedia, semáforos
MediatorCentraliza la comunicación entre objetosChat rooms, torres de control de aeropuerto, formularios complejos
IteratorRecorre una colección sin exponer su estructura internaRecorrer listas, árboles, resultados de base de datos
Chain of ResponsibilityPasa una petición por una cadena de manejadoresMiddleware de un framework, pipeline de validaciones, soporte técnico por niveles
MementoCaptura y restaura el estado interno de un objetoCtrl+Z en editores de texto, snapshots de configuración, checkpoints de juegos
Template MethodDefine el esqueleto de un algoritmo en la clase base, las subclases rellenan los pasosTests (setUp→execute→assert→tearDown), frameworks web, generación de informes
VisitorAñade operaciones nuevas a una jerarquía sin modificar sus clasesCompiladores (AST), exportadores multi-formato, validadores de documentos

¿Cómo elijo el patrón correcto?

No hay una fórmula mágica, pero puedes hacerte estas preguntas:

¿Es un problema de creación?

¿Necesitas controlar cómo y cuándo se crean los objetos? ¿Hay lógica compleja de instanciación? ¿Necesitas flexibilidad para decidir el tipo en tiempo de ejecución? → Patrón creacional

¿Es un problema de estructura?

¿Necesitas que clases diferentes trabajen juntas? ¿Quieres simplificar una interfaz compleja? ¿Necesitas añadir comportamiento sin modificar clases? → Patrón estructural

¿Es un problema de comunicación?

¿Necesitas que objetos reaccionen a cambios de otro? ¿Quieres intercambiar algoritmos? ¿Necesitas desacoplar quién envía una petición de quién la procesa? → Patrón de comportamiento

¿Realmente necesito un patrón?

A veces la solución más simple es la mejor. Si un if/else resuelve el problema y el código es claro, no fuerces un patrón. Un patrón mal aplicado es peor que no usar ninguno.


Errores comunes al aprender patrones

Cuando empiezas a estudiar patrones de diseño, hay trampas en las que cae casi todo el mundo:

1. Querer meter patrones en todas partes. El martillo de oro. Aprendes Singleton y de repente todo necesita ser Singleton. Aprendes Observer y hasta el “Hola mundo” tiene eventos. Los patrones son herramientas, no objetivos.

2. Aplicar un patrón sin entender el problema. Si no entiendes bien por qué existe el patrón, no vas a saber cuándo usarlo. Antes de implementar un Strategy, pregúntate: ¿realmente tengo algoritmos intercambiables o simplemente tengo un if/else que funciona perfecto?

3. Confundir patrones similares. Factory Method vs Abstract Factory, Strategy vs State, Decorator vs Proxy… Muchos se parecen en estructura pero resuelven problemas distintos. Lee bien las diferencias antes de elegir.

4. Pensar que los patrones son la única forma correcta. Los patrones GoF tienen más de 30 años. Son muy útiles, pero no son dogma. Hay problemas que se resuelven mejor con enfoques funcionales, con composición simple o con las herramientas que te da tu framework.


Principios SOLID y patrones de diseño

Los patrones de diseño y los principios SOLID van de la mano. De hecho, la mayoría de patrones existen precisamente para cumplir uno o varios principios SOLID:

Principio¿Qué dice?Patrones que lo aplican
SRPCada clase, una sola responsabilidadVisitor, Strategy, Command, Observer, Mediator
OCPAbierto a extensión, cerrado a modificaciónStrategy, Decorator, Observer, Visitor, Template Method
LSPLas subclases pueden sustituir a la clase baseFactory Method, Template Method, State, Strategy
ISPInterfaces pequeñas y específicasAdapter, Proxy, Observer, Iterator
DIPDepende de abstracciones, no de implementacionesFactory Method, Abstract Factory, Bridge, Strategy, Observer

No necesitas memorizar esta tabla. Cuando leas cada patrón en detalle (están todos enlazados arriba), verás cómo aplican estos principios de forma natural.


Conclusión

Los patrones de diseño no son magia ni bala de plata. Son herramientas que, usadas en el momento adecuado, hacen que tu código sea más limpio, más fácil de entender y más fácil de mantener.

Lo importante:

Los 23 patrones del catálogo GoF llevan más de 30 años funcionando. No están ahí por casualidad. Pero recuerda: el mejor código no es el que usa más patrones, sino el que resuelve el problema de la forma más simple y clara posible.

¡Un saludo y nos vemos en los bares! 🍻


🧠 Pon a prueba lo aprendido

1. ¿Qué es un patrón de diseño?

2. ¿En cuántas categorías agrupa el catálogo GoF los patrones de diseño?

3. ¿Qué tipo de problema resuelven los patrones creacionales?

4. ¿Cuál es una ventaja clave de conocer los patrones de diseño?

5. ¿Cuál es un error común al aprender patrones de diseño?

6. Si necesitas que dos interfaces incompatibles trabajen juntas, ¿qué tipo de patrón buscarías?

7. ¿Qué relación hay entre los principios SOLID y los patrones de diseño?

8. ¿Cuándo NO deberías usar un patrón de diseño?