¿Qué es un Patrón?


EL interés del mundo del software por los patrones de software tiene su origen, a partir de 1995, tras la aparición y el éxito del libro Design Patters: Elements of Reusable Object-Oriented Software escrito por: Erich Gamma, Richar Helm, Ralph Johnson y John Vlissides, llamados también pandilla de los cuatro  o GoF. Los cuales se dedicaron a recopilar una serie de patrones (23) aplicados habitualmente por expertos diseñadores de software orientado a objetos, los cuales no son los inventores, ni son los únicos implicados.

¿Qué es un patrón de software?
Los patrones de software no son más que un conjunto de literatura sobre la resolución de problemas habituales en el diseño de software orientado a objetos, que ha sido aceptada como correcta, a la que se le ha dado un nombre y que puede ser aplicada en varios contextos.
Los patrones empezaron siendo una forma fija, existía una especie de plantilla fija (siguiendo GoF), con motivación, explicación, etc. Algunos autores han desarrollado sus propias plantillas o formatos para patrones y otros optan por algo más sencillo.

PATRONES DE DISEÑO:
En 1979 el arquitecto Christopher Alexander aportó al mundo de la arquitectura el libro The Timeless Way of Building; proponía una serie de patrones para la construcción de edificios de una mayor calidad, "Cada patrón describe un problema que ocurre infinidad de veces en nuestro entorno, podemos utilizar una solución un millón de veces más adelante sin tener que volver a pensarla otra vez."
En la década de 1990 los patrones de diseño tuvieron un gran éxito en el mundo de la informática a partir de la publicación del libro Design Patterns.

Los patrones de diseño son la base para la búsqueda de soluciones a problemas comunes en el desarrollo de software y ámbitos referentes al diseño de interacción o interfaces, basados en la experiencia, sin ser un dogma y centrado en el nivel de abstracción del programador.

Un patrón de diseño es una solución estándar  a un problema común de diseño, el cual debe haberse comprobado su efectividad resolviendo problemas similares en ocasiones anteriores, debe ser reusable, lo que significa que es aplicable a diferentes problemas de diseño en distintas circunstancias, debe ser flexible para satisfacer ciertos criterios.




Tiene 4 elementos:
  * Nombre: Permite describir un problema de diseño junto con sus soluciones y consecuencias, incrementando el vocabulario de diseño, lo cual permite diseñar y comunicarse con un mayor nivel de abstracción   
 * Problema: Describe cuándo aplicar el patrón. Explica el problema y su contexto. A veces incluye condiciones que deben darse para que tenga sentido la aplicación del patrón.
  * Solución: Describe los elementos que constituyen el diseño, sus relaciones, responsabilidades y colaboraciones. Es una plantilla que puede aplicarse en muchas situaciones diferentes.
  * Consecuencias: son los resultados, así como ventajas e inconvenientes de aplicar el patrón.

Se dividen en 3 categorías:
                 
    * Creación: Abstraen el proceso de creación de instancias de objetos. Ayudan a hacer a un sistema independiente de cómo se crean, se componen y se representan sus objetos.
    * Estructurales: Tratan con la composición de clases u objetos. Se ocupan de cómo las clases y objetos son utilizados para componer estructuras de mayor tamaño.
    * Comportamiento: Caracterizan el modo en que las clases y objetos interactúan y se reparten la responsabilidad. Atañen a los algoritmos y a la asignación de responsabilidades entre objetos.


¿Cómo seleccionar un Patrón de Diseño?

·         Considerar cómo resuelven los problemas de diseño.
·         Revisar cuál es el propósito de cada patrón.
·         Estudiar cómo se interrelacionan.
·         Estudiar patrones con el mismo propósito detectado.
·         Detectar futuras causas de rediseño.
·         Considerar qué variará en el diseño propuesto.

¿Cómo usar un Patrón de Diseño?
·         Leer la descripción del patrón.
·         Estudiar las secciones: estructura, participantes y colaboraciones.
·         Mirar la sección de código fuente.
·         Elegir nombres para los participantes según el contexto del problema.
·         Definir las clases.
·         Definir los nombres de las operaciones.
·         Implementar las operaciones para asegurar las responsabilidades y colaboraciones del patrón.




Ventajas:

La clave de la reutilización es anticiparse a los nuevos requisitos y cambios, de modo que los sistemas evolucionen de forma adecuada. Facilitan la reusabilidad (previene reinventar la rueda), extensibilidad y mantenimiento.
Son un punto de partida, en lugar de una meta lo que proporciona la flexibilidad de su utilización. Facilitan la documentación, además de que existen diferentes patrones que tratan un problema desde diferente manera.

Desventajas:

No se deben usar ante de tiempo, es mejor implementar algo primero y asegurarse de que función, para luego usar el patrón, para así mejorar las debilidades.
Pueden disminuir la capacidad de comprensión de un diseño o de una implementación, puede generar menor rendimiento si se usa de manera indiscriminada, puede aumentar la cantidad de código, disminuir la modularidad, antes de que se aprenda, una vez esto suceda será más fácil y rápido comunicarse con otros diseñadores.