En software un patrón de diseño se refiere a una determinada forma de crear software, una forma de fabricarlo, por decirlo de alguna forma para crearlo de forma correcta.
En determinados marcos de trabajo, cuando nos enfrentamos a determinados problemas en el diseño de software hay formas determinadas de enfocalos que permiten adaptar mejor los posibles cambios de dichos problemas y las distintas evoluciones que pueda sufrir el software en un futuro.
En muchos casos el patrón se adapta como anillo al dedo al problema al que nos enfrentamos y en los casos en los que no es así generalmente tienden a encajar de forma progresiva.
Un buen dominio de los patrones más comunes nos puede servir para no tener que reinventar la rueda a cada paso que damos sino que podemos hacer uso de lo que otros pensaron por nosotros (y que descubriremos en multiples situaciones).
Siempre. O casi siempre.
En mi experiencia el uso de patrones de diseño es beneficioso en la mayoría de situaciones que se dan en cualquier proyecto medio complejo. Aún cuando en un principio el uso de determinados patrones de software pueda suponer una carga de trabajo adicional (cosa especialmente incomoda en los proyectos que van contrareloj) la ganancia en mantenibilidad del software merece la pena.
En la mayor parte de los casos implementar las cosas bien, pensando en adoptar un patrón adaptable que permita expandir el programa más adelante nos va a quitar muchos quebraderos en el futuro cuando el cliente quiera que cambiemos o ampliemos cosas (no creas que no va a pasar, el cliente siempre quiere cambiar algo, siempre).
La mayoría de los patrones de software que vamos a presentar consisten en acercarse a un problema concreto de una forma genérica de forma que tratamos de absorber los cambios en el problema (o las posible ampliaciones de este) de una forma genérica, lo que nos permitirá adaptarnos y mantener mejor el software durante la vida del producto.
Quizá hayas visto por ahí referirse a ciertos patrones de diseño de software como patrones GOF. Esta denominación viene dada por la publicación del patrón en un libro llamado Design Patterns: Elements of Reusable Object-Oriented Software (Patrones de diseño: Elementos reusables en software orientado a objetos) que contenía varios modelos de diseño de software y cuyos autores eran Erich Gamma, Richard Helm, Ralph Johnson y John Vlissides, conocidos como "The Gang of Four" (la banda de los cuatro).
Generalmente los patrones de software suelen subdividirse en varias clases:
Para toda esta serie de artículos voy a utilizar (como de costumbre) los nombres ingleses para los patrones. Esta es una costumbre común en informática por varias razones entre las que destacan el hecho de que gran parte de la bibliografía esté en ingles así como el hecho de que los nombres ingleses sean bastante universales (todo el mundo usa el mismo nombre) mientras que las traducciones pueden diferir dependiendo de quien las haga.
Así durante toda la serie se utilizarán nombres como patrón Abstract Factory en lugar de patrón de fábrica abstracta.
Aunque hay varios recursos en español en la red, hasta ahora los mejores ejemplos y artículos que yo he encontrado han venido dados en ingles. Un excelente recurso es el topic Design Pattern de la wikipedia inglesa, con descripciones de muchos de los patrones de diseño (GOF y otros).
Para el desarrollo de los distintos patrones de software intentaré ceñirme al esquema GOF (a una parte al menos) que distingue las distintas secciones que deben explicar un patrón y que fundamentalmente son: