Introducción a los patrones de diseño
Design patterns o patrones de diseño
Un design pattern o patrón de diseño consiste en un diagrama de objetos que forma una solución a un problema conocido y frecuente. El diagrama de objetos está constituido por un conjunto de objetos descritos por clases y las relaciones que enlazan los objetos.
Los patrones responden a problemas de diseño de aplicaciones en el marco de la programación orientada a objetos. Se trata de soluciones conocidas y probadas cuyo diseño proviene de la experiencia de los programadores. No existe un aspecto teórico en los patrones, en particular no existe una formalización (a diferencia de los algoritmos).
Los patrones de diseño están basados en las buenas prácticas de la programación orientada a objetos. Por ejemplo, la figura 1-1.1 muestra el patrón Template method que se describe en el capítulo El patrón Template Method. En este patrón, el método calculaPrecioConIVA invoca al método calculaIVA abstracto de la clase Pedido. Está definido en las subclases de Pedido, a saber las clases PedidoEspaña y PedidoFrancia. En efecto, el IVA varía en función del país. Al método calculaPrecioConIVA se le llama "modelo" (template method). Introduce un algoritmo basado en un método abstracto.
Este patrón está basado en el polimorfismo, una propiedad...
Descripción de los patrones de diseño
Hemos decidido describir los patrones de diseño con ayuda de los siguientes lenguajes:
-
El lenguaje de modelización UML introducido por el OMG (http://www.omg.org).
-
El lenguaje de programación Java creado por la empresa Oracle (http://www.java.com).
Los patrones de diseño se describen desde la sección 2 - Patrones de construcción hasta la sección 4 - Patrones de comportamiento. Para cada patrón se presentan los siguientes elementos:
-
El nombre del patrón.
-
La descripción del patrón.
-
Un ejemplo describiendo el problema y la solución basada en el patrón descrito mediante un diagrama de clases UML. En este diagrama, se describe el cuerpo de los métodos utilizando notas.
-
La estructura genérica del patrón, a saber:
-
Su esquema, extraído de cualquier contexto particular, bajo la forma de un diagrama de clases UML.
-
La lista de participantes del patrón.
-
Las colaboraciones en el patrón.
-
Los dominios de la aplicación del patrón.
-
Un ejemplo, presentado esta vez bajo la forma de un programa Java completo y documentado. Este programa no utiliza una interfaz gráfica sino exclusivamente las entradas/salidas por pantalla y teclado.
Catálogo de patrones de diseño
En este libro se presentan los veintitrés patrones de diseño descritos en el libro de referencia del "GoF". Estos patrones son diversas respuestas a problemas conocidos de la programación orientada a objetos. La lista que sigue no es exhaustiva y es resultado, como hemos explicado, de la experiencia.
-
Abstract Factory: tiene como objetivo la creación de objetos reagrupados en familias sin tener que conocer las clases concretas destinadas a la creación de estos objetos.
-
Builder: permite separar la construcción de objetos complejos de su implementación de modo que un cliente pueda crear estos objetos complejos con implementaciones diferentes.
-
Factory Method: tiene como objetivo presentar un método abstracto para la creación de un objeto reportando a las subclases concretas la creación efectiva.
-
Prototype: permite crear nuevos objetos por duplicación de objetos existentes llamados prototipos que disponen de la capacidad de clonación.
-
Singleton: permite asegurar que de una clase concreta existe una única instancia y proporciona un método único que la devuelve.
-
Adapter: tiene como objetivo convertir la interfaz de una clase existente en la interfaz esperada por los clientes también existentes para que puedan trabajar de forma conjunta.
-
Bridge: tiene como objetivo separar los aspectos conceptuales de una jerarquía...
Cómo escoger y utilizar un patrón de diseño para resolver un problema
Para saber si existe un patrón de diseño que responde a un problema concreto, la primera etapa consiste en ver las descripciones de la sección anterior y determinar si existe uno o varios patrones cuya descripción se acerque a la del problema.
A continuación, conviene estudiar con detalle el o los patrones descubiertos a partir de su descripción completa que se encuentra en las secciones 2 - Patrones de construcción a 4 - Patrones de comportamiento. En particular, conviene estudiar a partir del ejemplo que se proporciona y de la estructura genérica si el patrón responde de forma pertinente al problema. Este estudio debe incluir principalmente la posibilidad de adaptar la estructura genérica y, de hecho, averiguar si el patrón una vez adaptado responde al problema. Esta etapa de adaptación es una etapa importante del uso del patrón para resolver un problema. La describiremos a continuación.
Una vez escogido el patrón, su uso en una aplicación comprende las siguientes etapas:
-
Estudiar profundamente su estructura genérica, que sirve como base para utilizar un patrón.
-
Renombrar las clases y los métodos introducidos en la estructura genérica. En efecto, en la estructura genérica de un patrón, el nombre de las clases y de los métodos...
Organización del catálogo de patrones de diseño
Para organizar el catálogo de patrones de diseño, retomamos la clasificación del "GoF" que organiza los patrones según su vocación: construcción, estructuración y comportamiento.
Los patrones de construcción tienen como objetivo organizar la creación de objetos. Se describen en la parte 2 - Patrones de contrucción. Son un total de cinco: Abstract Factory, Builder, Factory Method, Prototype y Singleton.
Los patrones de estructuración facilitan la organización de la jerarquía de clases y de sus relaciones. Se describen en la parte 3 - Patrones de estructuración. Son un total de siete: Adapter, Bridge, Composite, Decorator, Facade, Flyweight y Proxy.
Por último, los patrones de comportamiento proporcionan soluciones para organizar las interacciones y para repartir el procesamiento entre los objetos. Se describen en la parte 4- Patrones de comportamiento. Son un total de once: Chain of responsibility, Command, Interpreter, Iterator, Mediator, Memento, Observer, State, Strategy, Template Method y Visitor.