¿Quieres conocer ¿qué son los patrones de diseño en Java? Llegaste al artículo correcto, pues aquí te diremos qué son, así como también te daremos a conocer su clasificación y un poco más.

patrones-de-diseño-en-java-1

Diagrama de objetos para solucionar problemas genéricos.

Patrones de diseño en Java

Antes de hablar de los patrones de diseño en Java, debemos advertir  que estos están enfocados hacia la programación orientada a objetos. En segundo lugar, es importante recordar algunos conceptos básicos asociados, entre ellos los siguientes:

Para información adicional, te invitamos a leer nuestro artículo denominado: La programación orientada a objetos: Definición.

Conceptos básicos asociados

Como siempre hemos dicho, la programación no es un hecho aislado, de tal manera que siempre es importante recordar algunos conceptos relacionados. En esta oportunidad, basta con referirnos a los siguientes aspectos:

Lenguaje de programación Java

Java es uno de los lenguajes de programación de data más antigua; además es de uso popular en la mayoría de las plataformas. Al respecto, podemos mencionar que muchas de las aplicaciones informáticas con las cuales contamos hoy en día están basadas en este importante lenguaje.

Sobre este último aspecto, podemos mencionar sobre todo las aplicaciones relacionadas con servicios Web. Por ejemplo: aplicaciones móviles, de escritorio, servidores, entre otras.

Por otra parte, Java pertenece al paradigma de programación orientado a objetos. Al respecto, a pesar de su naturaleza, es considerado un lenguaje confiable, seguro y fácil de utilizar.

Adicionalmente, tiene la ventaja de poder ejecutarse en cualquier máquina virtual Java, independientemente de la arquitectura del equipo. Dicho de otra manera, Java es un lenguaje de programación portable.

patrones-de-diseño-en-java-2

Patrón de diseño

Un patrón de diseño es una solución a un problema de diseño, el cual suele presentarse frecuentemente en la programación orientada a objetos. Adicionalmente, éste diagrama incluye la descripción de los objetos por clases, así como también las relaciones que los conectan.

Por otra parte, es importante mencionar que los patrones de diseño en general, son el resultado de las experiencias previas de los programadores. Adicionalmente, en los patrones de diseño en Java no existe una teorización, como sucede con otros elementos de la programación, como por ejemplo; los algoritmos.

¿Qué son los patrones de diseño en Java?

Como ya hemos mencionado, un patrón de diseño es un diagrama de objetos que cumple con la finalidad de solventar un problema de programación. Ahora bien, los patrones de diseño en Java representan la solución del problema, plasmada en un programa escrito en este lenguaje de programación en específico.

¿Cuáles son los patrones de diseño en Java?

En términos generales, podemos hablar de 23 patrones de diseños en Java. Al respecto, estos cuales fueron expuestos por primera vez en el año 1995, a través del libro Dessing Patterns.

Por otra parte, como ya hemos dicho, estos patrones resultan fundamentales para la resolución de posibles nuevos problemas. Adicionalmente, son respuestas a problemas conocidos, provenientes de las experiencias previas de los programadores especializados en el paradigma orientado a objetos.

Tipos de patrones de diseño en Java

De forma general, cada uno de los 23 patrones de diseño fundamentales se encuentra categorizado en alguno de los tres tipos generales de patrones de diseño en Java que existen. De esta manera, a continuación mostraremos los detalles sobre cada uno de ellos.

patrones-de-diseño-en-java-3

Patrones de construcción

La principal función de los patrones de construcción es organizar la creación de objetos, encapsulando el uso de clases concretas y promoviendo las interfaces en las relaciones entre ellos. A esta clase de patrones pertenecen los siguientes:

Abstract factory

Se encarga de crear objetos agrupados en familia, sin tomar en consideración las clases concretas por medio de las cuales se forman los objetos.

Builder

Ofrece la oportunidad de crear objetos complejos independientemente de su implementación o, lo que es lo mismo, mediante implementaciones distintas.

Factory Method

La principal función de este patrón es delegar en las subclases concretas la creación de un objeto. Al respecto, esto lo logra mediante la utilización de un método abstracto.

Prototype

Facilita la creación de nuevos objetos a partir de prototipos provenientes de la duplicación o clonación de objetos ya existentes.

Singleton

La función de este patrón es gestionar la existencia de clases que posean sólo una instancia, así como también proporcionar un método que sea capaz de devolver dicha instancia.

Al respecto, en el siguiente vídeo puedes ver más información.

Patrones de estructuración

Por su parte, los patrones de estructuración se encargan de organizar las jerarquías de las clases y las relaciones que las entrelazan. Dentro de esta clasificación se encuentran los siguientes:

Adapter

Se encarga de transformar la interfaz de una clase existente en otra con las características deseables por los usuarios del sistema, de tal forma que ambas resulten compatibles. En resumen, el patrón Adapter es el responsable de la adaptación de un objeto existente.

Bridge

La principal función de este patrón es desligar los aspectos conceptuales pertenecientes a una jerarquía de clases de su implementación. En otras palabras, este patrón es el encargado de la implementación de un objeto.

Composite

Este tipo de patrón se encarga de generar un marco de diseño de árbol, proveniente de una composición de objetos con profundidad variable. Dicho de otra manera, éste es el responsable de organizar la composición jerárquica de los objetos.

Decorator

Sirve para añadir nuevas funcionalidades, principalmente de tipo dinámicas, a un objeto con la finalidad de complementarlo. Al respecto, el resultado de este patrón es la sustitución de un objeto existente.

Sobre este patrón, puedes obtener más información a través del siguiente vídeo.

Facade

Su principal objetivo es facilitar la utilización de una interfaz de objetos, de manera que varias de ellas sean reagrupadas y unificadas en una sola. Al igual que en el patrón anterior, el resultado final es la sustitución de una serie de objetos.

Flayweight

En términos generales, el patrón Flayweight se encarga de realizar el proceso de compartición de una serie de objetos, sobre todo aquellos que poseen granularidad extremadamente fina. Adicionalmente, se encarga de guardar un estado independiente de los mismos.

Proxy

La principal función de un patrón Proxy es construir un objeto que pueda ser sustituido por otro, el cual tenga pleno control de su acceso. Al respecto, su objetivo es principalmente proporcionar las condiciones ideales en cuanto a optimización y protección del objeto se refiere.

Patrones de comportamiento

Finalmente, los patrones de comportamiento son quienes proporcionan las soluciones para organizar los datos y los objetos, adicionalmente, establecen el orden entre las interacciones que se producen en estos últimos. Dentro de este grupo de patrones podemos encontrar los siguientes:

Chain of responsability

Como su nombre lo indica, este patrón se refiere a la creación de una cadena de objetos, de forma que cuando uno de ellos no pueda responder a una instrucción, el siguiente eslabón logre dar la correspondiente respuesta.

Command

El principal objetivo de este patrón es convertir una consulta en un objeto, de tal manera que las operaciones básicas relacionadas sean más fáciles de realizar. Es decir, su función es transformar una solicitud en un objeto.

Interpreter

Se refiere a la posibilidad de ofrecer la representación de un lenguaje a través de objetos gramaticales. Esto con la finalidad de que las expresiones escritas de ese lenguaje puedan ser evaluadas e interpretadas fácilmente.

Si quieres más información al respecto, puedes ver el siguiente vídeo.

Iterator

Su principal función es permitir el acceso secuencial a un grupo de objetos, sin la necesidad de que los usuarios del sistema conozcan los aspectos relacionados con la implementación de los mismos.

Mediator

Tal y como su nombre lo indica, este patrón se encarga de construir un objeto que actúe como mediador entre las interacciones de los objetos sin que estos interactúen directamente.

Memento

En términos generales, es uno de los patrones de mayor importancia, pues es él quien se encarga de restaurar y resguardar el estado de los objetos. Al respecto, debemos advertir que una condición básica dentro de este patrón es el respeto a la encapsulación de las clases.

Observer

La principal función de este patrón es hacer que las modificaciones ocurridas en el sujeto sean notificadas a los observadores, a fines de que estos puedan actualizar sus estados.

State

El objetivo de este patrón es bastante fácil de entender, pues él se encarga de ofrecer la oportunidad de que un objeto pueda modificar su comportamiento en base a su estado interno.

Strategy

Facilita la adaptación entre el comportamiento y los algoritmos de un objeto, dependiendo de la existencia o no de una necesidad concreta por parte del sistema. Al respecto, las interacciones entre el objeto y los usuarios del sistema no deben alterarse durante la aplicación de este patrón.

Template method

Este patrón se encarga de realizar el correspondiente reporte acerca de las etapas que conforman las operaciones de un objeto, las cuales se encuentran descritas en las subclases. En otras palabras, se trata de delegar en las subclases algunas etapas que conforman las operaciones de un objeto.

Visitor

Se encarga de la construcción de una operación requerida relacionada con los elementos de una serie de objetos, sin que ocurra alguna modificación en las clases de los mismos. En resumen, este patrón es el encargado de añadir nuevas operaciones a una serie de objetos.

Ventajas de los patrones de diseño en Java

De forma general, podemos decir que la principal ventaja de los patrones de diseño en Java es que permiten construir aplicaciones complejas y robustas. Adicionalmente, ofrece la oportunidad de reutilizar las soluciones ya conocidas en el diseño de nuevas soluciones.

Por otra parte, por medio de la utilización de los patrones de diseño en Java, los diseñadores y desarrolladores en general, pueden afianzar sus conocimientos sobre la programación orientada a objetos. Al respecto, entre los principales fundamentos de este paradigma de programación, podemos mencionar los siguientes: polimorfismo, herencia, encapsulamiento, entre otros.

 

¿Cómo reconocer cuál patrón de diseño se adapta a nuestro problema?

Para identificar cuál patrón de diseño en Java es el que mejor responde a un problema de programación específico, lo primero que tenemos que conocer es el objetivo del mismo. De esta forma, una vez que hemos estudiado la descripción general de cada patrón de diseño, lo siguiente es pasar a la etapa de adaptación.

Al respecto, ésta se refiere a la posibilidad de que la estructura genérica del patrón se adapte a nuestro problema. Para ello, renombramos las clases y los métodos de dicha estructura y los integramos en nuestra aplicación de forma abstracta, esto a fines de probar si efectivamente el patrón es capaz de responder a nuestras exigencias.

Finalmente, si vamos por el buen camino, el último paso es nombrar estas clases y métodos según el objeto que describen y las operaciones que realizan. Al respecto, es importante advertir que en algunos casos es necesario realizarle modificaciones al diagrama de objetos.