Patrón de diseño

Un patrón de diseño es la forma reutilizable de una solución a un problema de diseño. La idea fue presentada por el arquitecto Christopher Alexander y ha sido adaptada para otras disciplinas, especialmente la informática.

Patrones de diseño de software
Los patrones de diseño de software son propuestas de soluciones generales que se han desarrollado para resolver problemas similares que se encuentran con frecuencia durante el diseño del software. Aunque los patrones de diseño de software generalmente se definen independientemente de los lenguajes de programación, los patrones de diseño de software adecuados para los lenguajes de programación orientados a objetos son más conocidos. Estos patrones muestran las relaciones e interacciones entre objetos y clases. El programador puede personalizar un patrón de diseño al observar el problema en su mano.

Detalles
Una colección organizada de patrones de diseño que se relacionan con un campo particular se llama lenguaje de patrones. Este lenguaje proporciona una terminología común para discutir las situaciones a las que se enfrentan los diseñadores.

Los elementos de este lenguaje son entidades llamadas patrones. Cada patrón describe un problema que ocurre una y otra vez en nuestro entorno, y luego describe el núcleo de la solución a ese problema, de tal manera que puede usar esta solución un millón de veces, sin hacerlo nunca de la misma manera dos veces . – Christopher Alexander

Documentar un patrón requiere explicar por qué una situación particular causa problemas y cómo los componentes del patrón se relacionan entre sí para dar la solución. Christopher Alexander describe problemas de diseño comunes que surgen de «fuerzas en conflicto», como el conflicto entre querer que una habitación esté soleada y que no se sobrecaliente en las tardes de verano. Un patrón no le diría al diseñador cuántas ventanas poner en la habitación; en su lugar, propondría un conjunto de valores para guiar al diseñador hacia una decisión que sea la mejor para su aplicación particular. Alexander, por ejemplo, sugiere que se deben incluir suficientes ventanas para dirigir la luz por toda la habitación. Considera que esta es una buena solución porque cree que aumenta el disfrute de la sala por parte de sus ocupantes. Otros autores podrían llegar a conclusiones diferentes si conceden un mayor valor a los costos de calefacción o los costos de los materiales. Estos valores, utilizados por el autor del patrón para determinar qué solución es «mejor», también se deben documentar dentro del patrón.

La documentación del patrón también debe explicar cuándo es aplicable. Dado que dos casas pueden ser muy diferentes entre sí, un patrón de diseño para las casas debe ser lo suficientemente amplio como para aplicarse a ambos, pero no tan vago que no ayuda al diseñador a tomar decisiones. El rango de situaciones en las que se puede usar un patrón se llama contexto. Algunos ejemplos podrían ser «todas las casas», «todas las casas de dos pisos» o «todos los lugares donde las personas pasan tiempo».

Por ejemplo, en el trabajo de Christopher Alexander, las paradas de autobús y las salas de espera en un centro de cirugía se encuentran dentro del contexto del patrón «UN LUGAR PARA ESPERAR».

Diseñar clases de patrones
El libro Patrones de diseño de la Cuadruplicencia de la cuadrilla (ISBN 0-201-63361-2) distingue tres patrones de patrones de diseño, pero no existe un criterio definido que los diferencie.

Patrones de creación
Los patrones de creación proporcionan sugerencias sobre cómo crear objetos de software (o, en otras palabras, instancias de clase). La idea es que un buen software debe diseñarse independientemente de cómo se crean los objetos que contiene. En otras palabras, dónde y cómo se crean los objetos no afecta el funcionamiento del software al que pertenecen; no se deben agregar nuevas características y problemas con los cambios.

A medida que evolucionan los sistemas de software, la composición de objetos adquiere más importancia que la herencia de clase. La razón de esto es que los diseños basados ​​en la definición de patrones simples de comportamiento básico para los sistemas de software son más flexibles que los diseños basados ​​en el comportamiento fijo. En otras palabras, agregar comportamientos a los objetos como una combinación permite que el comportamiento posterior se modifique de acuerdo con el desarrollo del software. En este caso, un diseño basado en los requisitos básicos de comportamiento para el software desarrollado hace posible el uso de comportamientos diferentes o más complejos sin modificar las interfaces del objeto.

Sin embargo, es más difícil muestrear objetos que proporcionan un comportamiento básico mediante combinaciones de objetivos, o crear objetos a partir de clases derivadas al heredar o alterar el comportamiento. Los patrones de creación incluyen patrones de software que se pueden usar para superar estas dificultades.

Los patrones de creación almacenan en el sistema de software qué clases concretas se usan en la instancia del objeto, así como también cómo se crean y ensamblan estas instancias.

Método de fábrica
Al heredar cómo el objeto lo crea bajo la única interfaz utilizada para la creación de objetos, deja las funciones de creación de objetos en la interfaz dejándolas en las subclases.

Ejemplo (patrón de prototipo)
Al crear objetos a partir de clases complejas y / o costosas, permiten que se creen objetos nuevos mediante el muestreo de los existentes en lugar de crearse desde el principio. De esta forma, los objetos nuevos se crean fácilmente y los recursos no se ocupan innecesariamente.

Patrón abstracto de fábrica
Una sola interfaz hace posible crear una familia de objetos en diferentes plataformas. Esta aplicación de software numerada se puede mover a diferentes plataformas sin ningún cambio de comportamiento. El patrón abstracto de fábrica mantiene qué clases concretas se usan bajo una única interfaz.

Patrón de constructor
Permite crear un grupo complejo de objetos en piezas según sea necesario a través de una única interfaz. A medida que el usuario usa el grupo de objetos, el grupo de objetos se estructura en la dirección requerida. Las piezas no utilizadas se crean innecesariamente y no gastan recursos.

El patrón singleton
En una clase, solo se crea un objeto para ser creado. Se puede acceder a este objeto desde cualquier lugar de la aplicación. El objeto no puede crearse hasta que se use por primera vez.

Patrones estructurales
Proporciona sugerencias que permiten la construcción de estructuras de software más amplias mediante la combinación de clases de patrones estructurales y objetos. Los patrones de estructura de clase y los patrones de estructura de objeto se dividen en dos.

Los patrones de estructura de clase amplían construcciones mediante el uso de aplicaciones de composición o herencia de clases. Los patrones de estructura de objetos muestran cómo combinar objetos para obtener nuevas funciones.

Patrón compuesto
Permite que los objetos se combinen juntos en una relación pieza-conjunto con una estructura de árbol, y se puede llegar a este compuesto desde una única interfaz. La estructura compuesta puede expandirse y contraerse con el tiempo agregando y eliminando objetos nuevos.

Fachada (patrón de fachada)
Permite que una estructura compleja se use en conjunto en una sola interfaz.

Patrón decorador
Permite que un objeto agregue nuevas responsabilidades sin cambiar el objeto. Hace posible mejorar la funcionalidad de los objetos sin subclasificación.

Patrón de puente
Permite que tanto la interfaz como la implementación concreta se separen entre sí. Cambiar la interfaz no afecta la interfaz. Ambos se pueden desarrollar de forma independiente.

Patrón de peso mosca
En lugar de crear una gran cantidad de objetos similares, permite la creación de una estructura de objetos saturada creando objetos visuales a partir de un objeto de ejemplo. Las variables de estado de los objetos visuales son almacenadas por el usuario, no por el objeto mismo.

Patrón de adaptador
Se usa para adaptar las interfaces de objetos o clases de diferentes fuentes.

Patrón de proxy
Es posible imitar la interfaz para usar objetos complicados, costosos y difíciles de construir. Permite que la orientación del objeto físico del objeto que se utilizará esté oculta para el usuario.

Patrones de comportamiento
Los patrones de comportamiento proporcionan sugerencias sobre cómo se pueden asignar las responsabilidades funcionales entre los objetos y cómo los métodos de solución requeridos por el software se pueden usar objetivamente. Los patrones de comportamiento también proporcionan objetos y patrones de clase, así como patrones relacionados con la comunicación entre objetos. Los patrones de comportamiento permiten al diseñador concentrarse en los métodos de comunicación y comunicación entre los objetos.

Los patrones de comportamiento también se dividen en dos, al igual que en los patrones estructurales: patrones de comportamiento de clase y patrones de comportamiento de los objetos.

Los patrones de comportamiento de clase permiten que el comportamiento se distribuya entre las clases utilizando la herencia. Los patrones de comportamiento de los objetos permiten lograr un comportamiento a través de un grupo de objetos que no puede lograrse fácilmente con un solo objeto mediante la composición de objetos.

Patrón de mediador
Los objetos conectados entre sí pueden guiarse desde un único punto (es decir, por el buscador) bajo el mismo techo. Los objetos conectados al buscador de búsqueda comunican cambios de estado al buscador de búsqueda. El buscador encuentra solicitudes de objetos relacionados con la edición y el pedido requeridos por la aplicación. Los objetos de usuario de nivel superior solo se conectan al buscador.

Patrón de estado
Permite que un objeto cambie su comportamiento de acuerdo con su situación. Desde la perspectiva del usuario, da la impresión de que está modificando la clase de objeto. Permite agregar y eliminar nuevos comportamientos en la dirección requerida por la aplicación. Los objetos de usuario no se ven afectados por dichos cambios.

Patrón de observador
Permite que un grupo de objetos, observadores, se informen automáticamente de los cambios en un objeto observado. El objeto bajo observación continúa funcionando independientemente de a quién se rastrea. Es posible que los nuevos observadores participen o salgan a tiempo. De esta forma, la aplicación puede cambiar el comportamiento a lo largo del tiempo.

Patrón de método de plantilla
Permite que se use un procedimiento como plantilla de solución. Hace posible que algunos pasos de procesamiento en el dado sean procesados ​​por subclases. Por lo tanto, algunos pasos intermedios se pueden cambiar sin cambiar el patrón principal. Los usuarios no están al tanto de estos cambios.

Patrón de comando
Hace posible que las solicitudes del usuario (objetivo) se transformen en objetos y se procesen. De esta forma, los deseos de diferentes usuarios pueden convertirse en registros objetivos y mantenerse en colas o registros. También es posible revertir las transacciones realizadas en esta bóveda.

Cadena de responsabilidades (patrón de cadena de responsabilidad)
Un usuario (objetivo) permite que la solicitud sea evaluada por múltiples objetos a cumplir. el usuario transmite la solicitud a través de una única interfaz. Las solicitudes se abordan a su vez por los objetos conectados a la solicitud. La solicitud se transfiere de un objeto a otro en la cadena hasta que sea bienvenida. Es posible agregar o eliminar nuevos objetos en la cadena a lo largo del tiempo. El usuario no se ve afectado por la interfaz de dichos cambios.

Patrón de intérprete
El pseudo-lenguaje definido para cumplir los requisitos de aplicaciones complejas es una plantilla de intérprete. El seudo-lenguaje permite que las reglas gramaticales se apliquen fácilmente definiéndolas como clases. Como las reglas de la gramática se definen como clases, se pueden modificar y mejorar fácilmente.

Yadigâr (patrón de recuerdo)
Yadigâr se usa para ocultar los estados de los objetos que desempeñan papeles importantes en el software de la aplicación y para recordarlos o recordarlos cuando sea necesario.

Patrón iterador
Asegura que los objetos ubicados debajo de un objeto masivo (Aggragate Object) puedan alcanzarse en secuencia, independientemente de cómo se representen o realicen los objetos. Los objetos representados de esta manera se pueden acceder a través de una única interfaz.

Estrategia (patrón de estrategia)
Bajo la misma interfaz, muchos métodos de solución que pueden resolver el mismo problema ocultan la clase, lo que permite satisfacer las solicitudes de los objetos del usuario sin saber qué método se utiliza. El usuario se enfrenta a diferentes formas de comportamiento cuando afirma que está trabajando con el mismo tipo de objeto.

Patrón de visitante
Permite agregar nuevas operaciones en una estructura compuesta. El visitante visita objetos individuales dentro de la estructura compuesta, recopila la información necesaria, la procesa y la presenta al usuario.