Incluso aunque aparentemente dos proyectos no tengan ninguna relación entre ellos, a menudo se encuentra que algunos de los problemas que se deben resolver son muy similares entre sí.

Un patrón de diseño es una guía que nos indica una posible solución a la hora de resolver uno de esos problemas recurrentes. Existen multitud de patrones de diseño que proporcionan soluciones a multitud de problemas comunes en el desarrollo de software.

Los patrones de diseño proporcionan varios beneficios a la hora de diseñar una aplicación software:

  • Reducen la complejidad. Un patrón de diseño se suele describir como una serie de elementos, tipicamente clases, y sus interacciones entre ellos. Dichos elementos se proporcionan como una guía por lo que la implementación de un mismo patrón puede variar de un sistema a otro.  Por lo tanto, la utilización de patrones de diseño nos proporciona un nivel de abstracción superior al nivel de clases y estructuras de datos reduciendo la complejidad que tenemos que manejar al pensar sobre el sistema.
  • Facilitan la comunicación. Cuando transmitimos a otra persona, por ejemplo, que en determinada parte del sistema se ha utilizado el patrón estrategia, dicha persona podrá entender rápidamente la clase de problema que resuelve esa parte del sistema y estará en condiciones de poder entender la estructura del código que la implementa rápidamente.
  • Reducen errores. A menudo el desarrollo de software se califica como un wicked problem, que de forma sencilla podría entenderse como un problema que no es comprendido hasta que no se ha formulado una solución. Los patrones de diseño acumulan la sabiduría de años en el intento de resolver esos problemas.
  • Facilitan el diseño. A la hora de enfrentarse a un problema de diseño, si se dispone de un catalogo de patrones, se puede evaluar cuales de ellos podrían servir para resolver dicho problema proporcionando un punto de partida al diseño.

Algunos de los patrones más comunes son:

  • Singleton. Proporciona un acceso global a una clase de la cual existe únicamente una instancia.
  • Estrategia. Define un conjunto de algoritmos o comportamientos fácilmente intercambiables. Permite que dichos algoritmos se puedan intercambiar independientemente del código que les utiliza.
  • Observador. Permite mantener a múltiples objetos en sincronía proporcionando un mecanismo para que los objetos puedan notificar los cambios que se produzcan en ellos a otros objetos que puedan estar interesados en dichas notificaciones.
  • Fachada (Facade). Proporciona un interface unificado a un conjunto de interfaces en un subsistema. Una fachada define un interface de un nivel de abstracción superior por lo que hace que el subsistema sea más fácil de utilizar.
  • Adaptador. Convierte el interface a una clase a otro tipo de interface, normalmente porque el cliente espera ese otro tipo de interface y de otra forma sería incompatible.

Se puede encontrar un completo listado de patrones, así como un buen artículo sobre los patrones de diseño en la Wikipedia.

Como se menciona en dicho artículo, los patrones de diseño adquirieron enorme popularidad a partir de la publicación del libro 'Design Patterns' escrito por el grupo conocido como Gang of Four (GoF) referenciado en las fuentes de este artículo.

Fuentes | Code Complete By Steve McConnell | Gamma, Erich, et al. Design Patterns. Reading, MA: Addison-Wesley, 1995