Introducción
Los patrones de diseño son muy populares entre los desarrolladores de software. Un patrón de diseño es una solución bien descrita a un problema común de software.
Algunos de los beneficios de utilizar patrones de diseño son:
- Los patrones de diseño ya están definidos y proporcionan un enfoque estándar de la industria para resolver un problema recurrente, por lo que ahorra tiempo si usamos sensatamente el patrón de diseño. Hay muchos patrones de diseño en Java que podemos utilizar en nuestros proyectos basados en Java.
- El uso de patrones de diseño promueve la reutilización que conduce a un código más robusto y altamente mantenible. Ayuda a reducir el costo total de propiedad (TCO) del producto de software.
- Dado que los patrones de diseño ya están definidos, hace que nuestro código sea fácil de entender y depurar. Conduce a un desarrollo más rápido y los nuevos miembros del equipo lo entienden fácilmente.
Los patrones de diseño en Java se dividen en tres categorías: creacionales, estructurales, y de comportamiento.
Este artículo sirve como un índice para todos los artículos de patrones de diseño en Java.
Patrones de Diseño Creacionales
Los patrones de diseño creacionales proporcionan soluciones para instanciar un Objeto
de la mejor manera posible para situaciones específicas.
1. Patrón Singleton
El patrón singleton restringe la instanciación de una Clase
y asegura que solo exista una instancia de la clase en la Máquina Virtual de Java. La implementación del patrón singleton siempre ha sido un tema controvertido entre los desarrolladores.
Nota: Obtén más información sobre el Patrón de Diseño Singleton.
2. Patrón de Fábrica
El patrón de diseño de fábrica se utiliza cuando tenemos una superclase con múltiples subclases y, según la entrada, necesitamos devolver una de las subclases. Este patrón quita la responsabilidad de la instanciación de una Clase
del programa cliente a la clase fábrica. Podemos aplicar un patrón singleton en la clase fábrica o hacer el método de fábrica static
.
Nota: Obtén más información sobre el Patrón de Diseño de Fábrica.
3. Patrón de Fábrica Abstracta
El patrón de fábrica abstracta es similar al patrón de fábrica y es una fábrica de fábricas. Si estás familiarizado con el patrón de diseño de fábrica en Java, notarás que tenemos una sola clase de fábrica que devuelve las diferentes subclases basadas en la entrada proporcionada y la clase de fábrica usa declaraciones if-else
o switch
para lograr esto. En el patrón de fábrica abstracta, nos deshacemos del bloque if-else
y tenemos una clase de fábrica para cada subclase y luego una clase de fábrica abstracta que devolverá la subclase basada en la clase de fábrica de entrada.
Nota: Obtén más información sobre el Patrón de Fábrica Abstracta.
4. Patrón Builder
El patrón builder fue introducido para resolver algunos de los problemas con los patrones de diseño de fábrica y fábrica abstracta cuando el objeto contiene muchas atributos. Este patrón resuelve el problema con un gran número de parámetros opcionales y un estado inconsistente al proporcionar una forma de construir el objeto paso a paso y proporcionar un método que devolverá el Objeto
final.
Nota: Aprende más sobre el Patrón Constructor.
5. Patrón Prototipo
El patrón prototipo se utiliza cuando la creación del Objeto
es costosa y requiere mucho tiempo y recursos, y ya tienes un Objeto
similar existente. Por lo tanto, este patrón proporciona un mecanismo para copiar el Objeto
original a un nuevo Objeto
y luego modificarlo según nuestras necesidades. Este patrón utiliza la clonación de Java para copiar el Objeto
. El patrón de diseño de prototipo exige que el Objeto
que estás copiando proporcione la función de copia. No debería ser realizado por ninguna otra clase. Sin embargo, si usar una copia superficial o profunda de las propiedades del objeto depende de los requisitos y es una decisión de diseño.
Nota: Aprende más sobre el Patrón Prototipo.
Patrones de Diseño Estructural
Los patrones de diseño estructurales proporcionan diferentes formas de crear una estructura de Clase
(por ejemplo, utilizando la herencia y la composición para crear un Objeto
grande a partir de Objeto
s pequeños).
1. Patrón de Adaptador
El patrón de diseño de adaptador es uno de los patrones de diseño estructurales y se utiliza para que dos interfaces no relacionadas puedan trabajar juntas. El objeto que une estas interfaces no relacionadas se llama adaptador.
Nota: Obtén más información sobre el Patrón de Adaptador.
2. Patrón Compuesto
El patrón compuesto se utiliza cuando tenemos que representar una jerarquía de parte-todo. Cuando necesitamos crear una estructura de manera que los objetos en la estructura deben tratarse de la misma manera, podemos aplicar el patrón de diseño compuesto.
Nota: Obtén más información sobre el Patrón Compuesto.
3. Patrón Proxy
El patrón proxy proporciona un marcador de posición para otro Object
para controlar el acceso a él. Este patrón se utiliza cuando queremos proporcionar acceso controlado a la funcionalidad.
Nota: Obtenga más información sobre el Patrón Proxy.
4. Patrón Peso Ligero
El patrón de diseño peso ligero se utiliza cuando necesitamos crear muchos Object
s de una Clase
. Dado que cada Object
consume espacio de memoria que puede ser crucial para dispositivos de baja memoria (como dispositivos móviles o sistemas integrados), el patrón de diseño peso ligero se puede aplicar para reducir la carga en la memoria compartiendo Object
s.
La implementación del pool de cadenas en Java es uno de los mejores ejemplos de implementación del patrón peso ligero.
Nota: Obtenga más información sobre el Patrón Peso Ligero.
5. Patrón de Fachada
El patrón de fachada se utiliza para ayudar a las aplicaciones cliente a interactuar fácilmente con el sistema.
Nota: Obtén más información sobre el Patrón de Fachada.
6. Patrón de Puente
Cuando tenemos jerarquías de interfaz tanto en las interfaces como en las implementaciones, entonces se utiliza el patrón de diseño de puente para desacoplar las interfaces de la implementación y ocultar los detalles de implementación de los programas cliente. La implementación del patrón de diseño de puente sigue la noción de preferir la composición sobre la herencia.
Nota: Obtén más información sobre el Patrón de Puente.
7. Patrón Decorador
El patrón de diseño decorador se utiliza para modificar la funcionalidad de un objeto en tiempo de ejecución. Al mismo tiempo, otras instancias de la misma clase no se verán afectadas por esto, por lo que el objeto individual obtiene el comportamiento modificado. El patrón de diseño decorador es uno de los patrones de diseño estructurales (como el patrón adaptador, el patrón puente o el patrón compuesto) y utiliza clases abstractas o interfaces con la composición para implementar. Utilizamos la herencia o la composición para extender el comportamiento de un objeto, pero esto se hace en tiempo de compilación y es aplicable a todas las instancias de la clase. No podemos agregar ninguna nueva funcionalidad para eliminar ningún comportamiento existente en tiempo de ejecución, y aquí es donde resulta útil el patrón decorador.
Nota: Aprende más sobre el Patrón Decorador.
Patrones de diseño de comportamiento
Los patrones de comportamiento proporcionan una solución para una mejor interacción entre objetos y cómo proporcionar desacoplamiento y flexibilidad para extender fácilmente.
1. Patrón de Método de Plantilla
El patrón de método de plantilla es un patrón de diseño de comportamiento y se utiliza para crear un esquema de método y para diferir algunas de las etapas de implementación a las subclases. El método de plantilla define los pasos para ejecutar un algoritmo, y puede proporcionar una implementación predeterminada que podría ser común para todas o algunas de las subclases.
Nota: Obtenga más información sobre el Patrón de Método de Plantilla.
2. Patrón Mediador
El patrón de diseño del mediador se utiliza para proporcionar un medio de comunicación centralizado entre diferentes objetos en un sistema. Si los objetos interactúan entre sí directamente, los componentes del sistema están estrechamente acoplados entre sí, lo que hace que el costo de mantenimiento sea más alto y no sea flexible para extender fácilmente. El patrón de mediador se centra en proporcionar un mediador entre objetos para la comunicación e implementar un acoplamiento débil entre objetos. El mediador funciona como un enrutador entre objetos, y puede tener su propia lógica para proporcionar una forma de comunicación.
Nota: Obtenga más información sobre el Patrón Mediador
3. Patrón de Cadena de Responsabilidad
El patrón de cadena de responsabilidad se utiliza para lograr un acoplamiento débil en el diseño de software, donde una solicitud del cliente se pasa a una cadena de objetos para procesarla. Luego, el objeto en la cadena decidirá quién procesará la solicitud y si es necesario enviar la solicitud al siguiente objeto en la cadena o no.
Sabemos que podemos tener varios bloques catch
en un bloque de código try-catch
. Aquí, cada bloque catch
es una especie de procesador para manejar esa excepción en particular. Entonces, cuando ocurre una excepción en el bloque try
, se envía al primer bloque catch
para su procesamiento. Si el bloque catch
no puede procesarlo, reenvía la solicitud al siguiente Object
en la cadena (es decir, al siguiente bloque catch
). Si incluso el último bloque catch
no puede procesarlo, la excepción se lanza fuera de la cadena al programa que la llamó.
Nota: Obtén más información sobre el Patrón de Cadena de Responsabilidad.
4. Patrón Observador
Un patrón de diseño observador es útil cuando estás interesado en el estado de un Object
y deseas ser notificado cada vez que haya algún cambio. En el patrón observador, el Object
que observa el estado de otro Object
se llama observador, y el Object
que está siendo observado se llama sujeto.
Java proporciona una plataforma integrada para implementar el patrón observador a través de la clase java.util.Observable
y la interfaz java.util.Observer
. Sin embargo, no es ampliamente utilizado porque la implementación es limitada y la mayoría de las veces no queremos terminar extendiendo una clase únicamente para implementar el patrón observador, ya que Java no proporciona herencias múltiples en las clases. Java Message Service (JMS) utiliza el patrón observador junto con el patrón mediador para permitir que las aplicaciones se suscriban y publiquen datos a otras aplicaciones.
Nota: Aprende más sobre el Patrón Observador.
5. Patrón Estrategia
El patrón estrategia se utiliza cuando tenemos múltiples algoritmos para una tarea específica y el cliente decide la implementación real que se utilizará en tiempo de ejecución. El patrón estrategia también se conoce como patrón de política. Definimos múltiples algoritmos y permitimos que las aplicaciones cliente pasen el algoritmo a utilizar como parámetro.
Uno de los mejores ejemplos de este patrón es el método Collections.sort()
que toma el parámetro Comparator. Según las diferentes implementaciones de interfaces de comparador, los objetos se ordenan de diferentes maneras.
Nota: Obtén más información sobre el Patrón de Estrategia.
6. Patrón de Comando
El patrón de comando se utiliza para implementar el desacoplamiento en un modelo de solicitud-respuesta. En este patrón, la solicitud se envía al invocador y el invocador la pasa al objeto comando encapsulado. El objeto de comando pasa la solicitud al método apropiado del receptor para realizar la acción específica.
Nota: Obtén más información sobre el Patrón de Comando.
7. Patrón de Estado
El patrón de diseño de estado se utiliza cuando un Objeto
cambia su comportamiento según su estado interno. Si tenemos que cambiar el comportamiento de un Objeto
según su estado, podemos tener una variable de estado en el Objeto
y usar un bloque de condición if-else
para realizar diferentes acciones según el estado. El patrón de estado se utiliza para proporcionar una forma sistemática y desacoplada de lograr esto a través de implementaciones de contexto y estado.
Nota: Obtén más información sobre el Patrón de Estado.
8. Patrón de Visitante
El patrón de visitante se utiliza cuando tenemos que realizar una operación en un grupo de objetos similares. Con la ayuda de un patrón de visitante, podemos mover la lógica operativa de los objetos a otra clase.
Nota: Obtén más información sobre el Patrón de Visitante.
9. Patrón de Intérprete
El patrón de intérprete se utiliza para definir una representación gramatical de un lenguaje y proporciona un intérprete para manejar esta gramática.
10. Patrón Iterator
El patrón iterator es uno de los patrones de comportamiento y se utiliza para proporcionar una forma estándar de recorrer un grupo de objetos. El patrón iterator se utiliza ampliamente en el Java Collection Framework, donde la interfaz del iterador proporciona métodos para recorrer una Collection
. Este patrón también se utiliza para proporcionar diferentes tipos de iteradores según nuestros requisitos. El patrón iterator oculta la implementación real del recorrido a través de la Collection
y los programas clientes utilizan los métodos del iterador.
Nota: Obtén más información sobre el Patrón Iterator.
11. Patrón Memento
El patrón de diseño memento se utiliza cuando queremos guardar el estado de un objeto para poder restaurarlo más tarde. Este patrón se utiliza para implementar esto de tal manera que los datos del estado guardado del objeto no son accesibles fuera del Object
, lo que protege la integridad de los datos del estado guardado.
El patrón Memento se implementa con dos objetos – originador y guardián. El originador es el objeto cuyo estado necesita ser guardado y restaurado, y utiliza una clase interna para guardar el estado del objeto. La clase interna se llama “Memento”, y es privada para que no pueda ser accedida desde otros objetos.
Patrones de Diseño Variados
Hay muchos patrones de diseño que no caen bajo los patrones de diseño del Gang of Four. Veamos algunos de estos patrones de diseño populares.
1. Patrón de Diseño DAO
El patrón de diseño DAO (Data Access Object) se utiliza para desacoplar la lógica de persistencia de datos a un nivel separado. DAO es un patrón muy popular cuando diseñamos sistemas para trabajar con bases de datos. La idea es mantener la capa de servicio separada de la capa de acceso a datos. De esta manera, implementamos la separación de lógica en nuestra aplicación.
Nota: Obtén más información sobre el Patrón DAO.
2. Patrón de Inyección de Dependencias
El patrón de inyección de dependencias nos permite eliminar las dependencias codificadas en duro y hacer que nuestra aplicación sea débilmente acoplada, extensible y mantenible. Podemos implementar la inyección de dependencias en Java para mover la resolución de dependencias desde el tiempo de compilación hasta el tiempo de ejecución. El framework Spring está construido sobre el principio de la inyección de dependencias.
Nota: Aprende más sobre el Patrón de Inyección de Dependencias.
3. Patrón MVC
El Patrón Modelo-Vista-Controlador (MVC) es uno de los patrones arquitectónicos más antiguos para crear aplicaciones web.
Conclusión
Este artículo resumió los patrones de diseño de Java.
Puedes revisar ejemplos de código de patrones de diseño de Java en nuestro Repositorio de GitHub.
Continúa tu aprendizaje con más tutoriales de Java.
Source:
https://www.digitalocean.com/community/tutorials/java-design-patterns-example-tutorial