system onlinepath: /guias/programacion/patrones-de-diseno-con-ejemplos-practicos/mode: knowledge_baselocal:
Programación · Nivel intermedio

Patrones de diseño explicados con ejemplos prácticos

Un patrón de diseño es una solución ya probada a un problema que aparece una y otra vez. No son recetas mágicas: son vocabulario compartido y estructura reutilizable, útiles solo cuando el problema que resuelven existe de verdad.

11 min de lectura▣ Actualizada el ◇ Por Underc0de
Respuesta rápida

Un patrón de diseño es una solución ya probada a un problema de estructura que aparece una y otra vez en el software. No es código que se copia, sino una forma de organizar el código que otros ya validaron, más un vocabulario común: decir «esto es un observador» comunica en dos palabras una estructura entera. Se agrupan en tres familias: de creación (cómo se crean los objetos: singleton, factory), estructurales (cómo se componen: adapter, decorator) y de comportamiento (cómo se comunican y actúan: observer, strategy). Cada uno resuelve un problema concreto: el strategy, elegir entre algoritmos intercambiables; el observer, avisar a varias partes cuando algo cambia. El error más grave, y el más común, es forzarlos: meter un patrón donde no hay el problema que resuelve solo complica el código. La regla es reconocer el patrón cuando el problema aparece, no salir a buscar dónde encajarlo.

Ver índice de contenidos
  1. 01Qué es un patrón de diseño
  2. 02Patrones de creación
  3. 03Patrones estructurales
  4. 04Patrones de comportamiento
  5. 05El sobrediseño: el error grave
  6. 06Errores frecuentes
  7. 07Preguntas frecuentes
  8. 08Fuentes

Qué es un patrón de diseño

Cuando muchas personas resuelven el mismo tipo de problema durante años, aparecen soluciones que funcionan mejor que otras. Un patrón de diseño es una de esas soluciones, descrita de forma general para que se pueda reconocer y reaplicar. No es una biblioteca ni código listo para pegar: es una plantilla de estructura que adaptás a tu caso.

Los dos valores de un patrón

Estructura reutilizable: no reinventás la organización de algo que ya se resolvió bien mil veces. Vocabulario compartido: decir «acá uso un observer» le comunica a otro programador una estructura completa en una palabra, sin explicar los detalles. Ese lenguaje común es, para muchos, el mayor beneficio de conocer los patrones, incluso más que las soluciones en sí.

Los patrones clásicos se catalogaron en un libro conocido como el de la «banda de los cuatro», y desde entonces son parte del vocabulario del oficio. Presuponen la base de código limpio: un patrón bien aplicado sobre código sucio sigue siendo código sucio.

Patrones de creación

Las tres familias de patrones de diseño y ejemplos de cada una, presentadas como tres columnas. Primera columna, patrones de creación, que resuelven cómo se crean los objetos. El singleton garantiza que exista una única instancia de algo compartido en toda la aplicación, como una configuración global o una única conexión, y da un punto de acceso a ella; su ejemplo real es un gestor de configuración que se lee una vez y todos consultan. El factory centraliza la decisión de qué objeto concreto crear según una condición, en lugar de esparcir esa decisión por todo el código; su ejemplo es una función que, según el tipo de archivo, devuelve el lector adecuado. Segunda columna, patrones estructurales, que resuelven cómo se componen los objetos entre sí. El adapter permite que dos piezas con interfaces incompatibles trabajen juntas, envolviendo una para que hable el lenguaje que la otra espera; su ejemplo es adaptar una biblioteca externa a la interfaz que usa el resto del sistema. El decorator agrega comportamiento a un objeto envolviéndolo, sin modificar su código original; su ejemplo es añadir registro o memoria caché alrededor de una función existente. Tercera columna, patrones de comportamiento, que resuelven cómo se comunican y actúan los objetos. El strategy permite intercambiar algoritmos que resuelven lo mismo de formas distintas, eligiendo cuál usar en el momento; su ejemplo es cambiar el método de cálculo del costo de envío según el transportista sin tocar el resto. El observer permite que varias partes se enteren automáticamente cuando algo cambia, suscribiéndose a un sujeto que les avisa; su ejemplo es que varios componentes de una interfaz reaccionen cuando cambia un dato compartido. En el centro, resaltada, la advertencia central: el mayor error con los patrones es forzarlos donde no existe el problema que resuelven, porque un patrón metido sin necesidad agrega complejidad y capas sin aportar nada, volviendo el código más difícil de entender en vez de más fácil. Al pie, la regla que ordena todo: primero aparece el problema, y solo entonces se reconoce el patrón que lo resuelve; nunca al revés, saliendo a buscar dónde encajar un patrón aprendido.
Tres familias: creación, estructura y comportamiento. Cada patrón resuelve un problema concreto; forzarlos es el error grave.

Los patrones de creación resuelven cómo se crean los objetos. Dos de los más útiles:

  • Singleton. Garantiza que exista una sola instancia de algo compartido en toda la aplicación —una configuración global, una única conexión— y ofrece un punto de acceso a ella. Ejemplo: un gestor de configuración que se lee una vez y todos consultan. (Advertencia: se abusa de él; a veces esconde estado global que complica las pruebas.)
  • Factory. Centraliza en un solo lugar la decisión de qué objeto concreto crear según una condición, en vez de esparcir esa decisión por todo el código. Ejemplo: una función que, según el tipo de archivo, devuelve el lector adecuado.

Patrones estructurales

Los estructurales resuelven cómo se componen los objetos entre sí. Dos frecuentes:

  • Adapter (adaptador). Permite que dos piezas con interfaces incompatibles trabajen juntas, envolviendo una para que «hable» el lenguaje que la otra espera. Ejemplo: adaptar una biblioteca externa a la interfaz que usa el resto de tu sistema, para poder cambiarla después sin tocar todo.
  • Decorator (decorador). Agrega comportamiento a un objeto envolviéndolo, sin modificar su código original. Ejemplo: añadir registro de actividad o memoria caché alrededor de una función que ya existe, sin tocarla.

La idea común de los estructurales es componer en lugar de modificar: en vez de cambiar código que ya funciona (y arriesgarse a romperlo), lo envolvés o lo conectás. Es una aplicación directa del principio de mantener lo estable intacto.

Patrones de comportamiento

Los de comportamiento resuelven cómo se comunican y actúan los objetos. Los dos más útiles de conocer:

javascript
// STRATEGY: algoritmos intercambiables para el mismo problema.
// El costo de envío se calcula distinto según el transportista,
// pero el resto del código no necesita saber cuál se usa.
const estrategias = {
  estandar: (peso) => peso * 2,
  express:  (peso) => peso * 5 + 3,
};
function calcularEnvio(peso, metodo) {
  return estrategias[metodo](peso);  // se elige la estrategia en el momento
}
  • Strategy (estrategia). Permite intercambiar algoritmos que resuelven lo mismo de formas distintas, eligiendo cuál usar en el momento, sin llenar el código de condiciones. Agregar un transportista nuevo es sumar una entrada, no tocar la lógica.
  • Observer (observador). Permite que varias partes se enteren automáticamente cuando algo cambia: se «suscriben» a un sujeto que les avisa. Es el corazón de cómo React actualiza la interfaz cuando cambia el estado, y de la programación por eventos.

El sobrediseño: el error grave

Acá está lo que separa usar bien los patrones de arruinar un proyecto con ellos. El error más común y más dañino es forzar un patrón donde no existe el problema que resuelve. Quien acaba de aprender patrones tiende a ver clavos por todos lados: mete un factory para crear una sola clase, un singleton para algo que no necesita ser único, capas de abstracción «por si acaso».

!
Primero el problema, después el patrón

Un patrón metido sin necesidad no simplifica: agrega estructura, capas y nombres nuevos que hay que entender, para resolver un problema que no tenías. El resultado es código más difícil de leer, justo lo contrario de la meta. La regla de oro es al revés de como suena la tentación: no salgas a buscar dónde aplicar un patrón que aprendiste; esperá a que aparezca el problema, y reconocé entonces qué patrón lo resuelve. Es la misma lógica del equilibrio del código limpio: la solución más simple que funciona casi siempre gana.

Los patrones son un destino, no un punto de partida. Se llega a ellos cuando el código empieza a doler de una forma que un patrón conocido alivia; empezar por el patrón es construir la solución antes de tener el problema.

Errores frecuentes

  • Forzar patrones donde no hay problema. El error más grave: agrega complejidad sin resolver nada.
  • Aprender patrones y ver clavos por todos lados. No todo problema necesita un patrón con nombre.
  • Abusar del singleton. Esconde estado global que complica las pruebas y el razonamiento.
  • Aplicar un patrón sobre código sucio. Un patrón no arregla nombres malos ni funciones enormes.
  • Memorizar la lista en vez de entender el problema de cada uno. Lo útil es reconocer cuándo aparece el problema.
  • Ignorar el vocabulario común. Saber nombrar un patrón comunica una estructura entera en una palabra.
  • Confundir patrón con biblioteca. Un patrón es una forma de organizar, no código que se instala.

Preguntas frecuentes

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

Es una solución ya probada a un problema de estructura que aparece una y otra vez en el software, descrita de forma general para poder reconocerla y reaplicarla en distintos contextos. No es una biblioteca ni código listo para copiar y pegar, sino una plantilla de organización que se adapta a cada caso concreto. Su valor es doble. Por un lado, aporta estructura reutilizable: evita reinventar la forma de resolver algo que muchas personas ya resolvieron bien a lo largo de los años. Por otro, y quizás más importante, aporta un vocabulario compartido: poder decir que en cierta parte se usa un observador o una estrategia comunica a otro programador una estructura entera en una sola palabra, sin necesidad de explicar los detalles. Ese lenguaje común es, para muchos, el mayor beneficio de conocer los patrones.

¿Cuáles son las familias de patrones?

Los patrones clásicos se agrupan en tres familias según qué tipo de problema resuelven. Los patrones de creación se ocupan de cómo se crean los objetos, e incluyen el singleton, que garantiza una única instancia compartida, y el factory, que centraliza la decisión de qué objeto concreto crear. Los patrones estructurales se ocupan de cómo se componen los objetos entre sí, e incluyen el adaptador, que hace que piezas con interfaces incompatibles trabajen juntas, y el decorador, que agrega comportamiento envolviendo un objeto sin modificarlo. Y los patrones de comportamiento se ocupan de cómo se comunican y actúan los objetos, e incluyen la estrategia, que permite intercambiar algoritmos, y el observador, que avisa automáticamente a varias partes cuando algo cambia. No hace falta memorizarlos todos: conviene entender el problema que resuelve cada uno para reconocerlo cuando aparezca.

¿Cuándo debo usar un patrón de diseño?

Cuando aparece de verdad el problema que ese patrón resuelve, y no antes. La regla de oro es contraintuitiva respecto de la tentación natural: no hay que salir a buscar dónde aplicar un patrón recién aprendido, sino esperar a que el código empiece a doler de una forma concreta que un patrón conocido alivia, y reconocer entonces cuál encaja. Los patrones son un destino al que se llega, no un punto de partida desde el que se construye. Por ejemplo, el patrón de estrategia tiene sentido cuando ya tenés varias formas de calcular lo mismo y el código se está llenando de condiciones para elegir entre ellas; aplicarlo antes, cuando hay una sola forma, solo agrega estructura innecesaria. Primero el problema, después el patrón: ese orden es lo que distingue el buen uso del sobrediseño.

¿Por qué es malo forzar patrones?

Porque un patrón metido donde no existe el problema que resuelve no simplifica nada: al contrario, agrega estructura, capas de abstracción y nombres nuevos que quien lea el código tendrá que entender, todo para resolver un problema que no se tenía. El resultado es código más difícil de leer y mantener, justo lo opuesto a la meta de los patrones. Es un error especialmente común en quien acaba de aprenderlos, porque genera la tendencia a ver oportunidades de aplicarlos por todas partes, metiendo una fábrica para crear una sola clase o un singleton para algo que no necesita ser único. La solución más simple que funciona casi siempre es la mejor, y agregar un patrón debe justificarse por un beneficio real y presente, no por la satisfacción de usar una técnica conocida o por una necesidad futura imaginada que quizás nunca llegue.

¿Los patrones dependen del lenguaje?

Los patrones como conceptos son en gran medida independientes del lenguaje, porque describen formas de organizar el código para resolver problemas de estructura que aparecen en muchos lenguajes distintos. Dicho esto, la forma concreta de implementarlos y su utilidad varían según las características de cada lenguaje. Algunos patrones que son muy necesarios en lenguajes rígidos resultan triviales o innecesarios en lenguajes más flexibles, porque el propio lenguaje ya ofrece de forma nativa lo que el patrón lograba a mano. Por ejemplo, en lenguajes donde las funciones se pueden pasar como valores, el patrón de estrategia se vuelve casi transparente. Por eso conviene entender el problema que cada patrón resuelve más que memorizar su implementación en un lenguaje: así se reconoce cuándo el lenguaje ya lo resuelve solo y cuándo hace falta aplicarlo explícitamente.

¿Necesito saber patrones para conseguir trabajo?

Conocer los patrones más comunes y, sobre todo, entender el vocabulario asociado es muy valioso, porque aparece en entrevistas, en la lectura de código ajeno y en las conversaciones de equipo, donde nombrar un patrón es una forma rápida de comunicar una estructura. Pero es más importante entender el problema que cada uno resuelve y saber cuándo aplicarlo con criterio que memorizar una lista de definiciones. Quien recita patrones pero los fuerza en todos lados es un problema mayor que quien conoce pocos pero escribe código simple y claro. La recomendación práctica es aprenderlos después de tener una base sólida de fundamentos y de código limpio, reconociendo los más frecuentes en proyectos reales, y dejar el estudio exhaustivo del catálogo completo para cuando ya se tenga experiencia suficiente para juzgar cuándo cada uno aporta de verdad.

Fuentes

Documentación oficial y material de la comunidad consultados para esta guía. Fecha de consulta: 28 de julio de 2026.

Aportes de la comunidad Underc0de

  1. Underc0de, foro. Sección Programación. Discusiones sobre arquitectura, diseño y estructura de proyectos.
  2. Underc0de, foro. Sección Desarrollo web. Patrones aplicados en proyectos reales.

Documentación oficial

  1. Refactoring Guru. Design Patterns. Catálogo ilustrado de patrones en español, con ejemplos.
  2. Martin Fowler. martinfowler.com. Referencia sobre diseño y arquitectura de software.
  3. Mozilla. JavaScript en MDN. Base del lenguaje usado en los ejemplos.
  4. Gamma, Helm, Johnson y Vlissides. Design Patterns (la «banda de los cuatro»). El libro que catalogó los patrones clásicos.