Introducción a los patrones de diseño de creación

Introducción

En ingeniería de software, un patrón de diseño describe una solución establecida para los problemas más comunes de software diseño. Representa las mejores prácticas desarrolladas durante un largo período a través de prueba y error por desarrolladores de software experimentados.

Design Patterns ganó popularidad después de que el libro Design Patterns: Elements of Reusable Object-Oriented Software fuera publicado en 1994 por Erich Gamma , John Vlissides, Ralph Johnson y Richard Helm (también conocido como Gang of Four o GoF).

En este artículo, exploraremos los patrones de diseño de creación y sus tipos. También veremos algunos muestras de código y discutir las situaciones en las que estos patrones se ajustan a nuestro diseño.

Patrones de diseño creacional

Los patrones de diseño creacional se refieren a la forma en que se crean los objetos . Reducen la complejidad y la inestabilidad al crear objetos de manera controlada.

El nuevo operador a menudo se considera dañino ya que dispersa objetos por toda la aplicación. Con el tiempo, cambiar una implementación puede convertirse en un desafío porque las clases se acoplan estrechamente.

Los patrones de diseño de creación abordan este problema desacoplando al cliente por completo del proceso de inicialización real.

En este artículo , analizaremos cuatro tipos de patrones de diseño de creación:

  1. Singleton: garantiza que, como máximo, solo exista una instancia de un objeto en toda la aplicación
  2. Método de fábrica: crea objetos de varias clases relacionadas sin especificar el objeto exacto que se creará
  3. Abstract Factory: crea familias de objetos dependientes relacionados
  4. Builder: construye objetos complejos utilizando un enfoque paso a paso

Analicemos ahora cada uno de estos patrones en detalle.

Patrón de diseño singleton

El patrón de diseño Singleton tiene como objetivo mantener una verificación de la inicialización de objetos de una clase en particular asegurándose de que solo existe una instancia del objeto en toda la Máquina Virtual Java.

Una clase Singleton también proporciona un punto de acceso global único al objeto, de modo que cada llamada subsiguiente al punto de acceso devuelve solo ese objeto en particular.

3.1. Ejemplo de patrón Singleton

Aunque GoF introdujo el patrón Singleton, se sabe que la implementación original es problemática en escenarios multiproceso.

Así que aquí » Vamos a seguir un enfoque más óptimo que utiliza una clase interna estática:

Aquí, hemos creado una clase interna estática que contiene la instancia de la clase Singleton. Crea la instancia solo cuando alguien llama al método getInstance () y no cuando se carga la clase externa.

Este es un enfoque ampliamente utilizado para una clase Singleton ya que no requiere sincronización, es seguro para subprocesos , impone la inicialización diferida y tiene comparativamente menos texto estándar.

Además, tenga en cuenta que el constructor tiene el modificador de acceso privado. Este es un requisito para crear un Singleton, ya que un constructor público significaría que cualquiera podría acceder a él y comenzar a crear nuevas instancias.

Recuerde, esta no es la implementación original de GoF. Para la versión original, visite este artículo vinculado de Baeldung sobre Singletons en Java.

3.2. Cuándo utilizar el patrón de diseño Singleton

  • Para recursos que son costosos de crear (como bases de datos objetos de conexión)
  • Es una buena práctica mantener todos los registradores como Singletons, lo que aumenta el rendimiento
  • Clases que brindan acceso a los ajustes de configuración de la aplicación
  • Clases que contienen recursos a los que se accede en modo compartido

Patrón de diseño de método de fábrica

El patrón de diseño de fábrica o el patrón de diseño de método de fábrica es uno de los los patrones de diseño más utilizados en Java.

Según GoF, este patrón «define una interfaz para crear un objeto, pero permite que las subclases decidan qué clase instalar tiar. El método Factory permite que una clase difiera la instanciación a subclases ”.

Este patrón delega la responsabilidad de inicializar una clase del cliente a una clase de fábrica en particular creando un tipo de constructor virtual.

Para lograrlo, nos apoyamos en una fábrica que nos proporciona los objetos, ocultando los detalles de implementación reales. Se accede a los objetos creados mediante una interfaz común.

4.1. Ejemplo de patrón de diseño de método de fábrica

En este ejemplo, crearemos una interfaz Polygon que será implementada por varias clases concretas. Se usará una PolygonFactory para buscar objetos de esta familia :

Primero, creemos la interfaz Polygon:

A continuación, Crearemos algunas implementaciones como Square, Triangle, etc. que implementan esta interfaz y devuelven un objeto de tipo Polygon.

Ahora podemos crear una fábrica que tome el número de lados como argumento y devuelva la implementación adecuada de esta interfaz:

Observe cómo el cliente puede confiar en esta fábrica para darnos un Polígono apropiado, sin tener que inicializar el objeto directamente.

4.2. Cuándo utilizar el patrón de diseño del método de fábrica

  • Cuando se espera que la implementación de una interfaz o una clase abstracta cambie con frecuencia
  • Cuando la implementación actual no puede adaptarse cómodamente a un nuevo cambio
  • Cuando el proceso de inicialización es relativamente simple, y el constructor solo requiere un puñado de parámetros

Patrón de diseño de fábrica abstracto

En la sección anterior, vimos cómo el patrón de diseño del Método de Fábrica podría usarse para crear objetos relacionados con una sola familia.

Por el contrario, se usa el Patrón de Diseño de Fábrica Abstracta para crear familias de objetos relacionados o dependientes. A veces también se le llama fábrica de fábricas.

Para obtener una explicación detallada, consulte nuestro tutorial de Abstract Factory.

Patrón de diseño del constructor

El patrón de diseño del constructor es otro patrón de creación diseñado para hacer frente a la construcción de objetos comparativamente complejos.

Cuando aumenta la complejidad de crear un objeto, el patrón del constructor puede separar el proceso de creación de instancias utilizando otro object (un constructor) para construir el objeto.

Este constructor se puede usar para crear muchas otras representaciones similares usando un enfoque simple paso a paso.

6.1. Patrón del constructor Ejemplo

El patrón de diseño de constructor original introducido por GoF se centra en la abstracción y es muy bueno cuando se trata de objetos complejos, sin embargo, el diseño es un poco complicado.

Joshua Bloch, en su libro Effective Java, presentó una versión mejorada del patrón del constructor que es limpia, altamente legible (porque hace uso de diseño fluido) y fácil de usar desde la perspectiva del cliente. En este ejemplo, analizaremos esa versión.

Este ejemplo tiene solo una clase, BankAccount, que contiene un constructor como clase interna estática:

Tenga en cuenta que todos los modificadores de acceso en los campos se declaran privados ya que no queremos que los objetos externos accedan a ellos directamente.

El constructor también es privado, por lo que solo el Constructor asignado a este la clase puede acceder a ella. Todas las propiedades establecidas en el constructor se extraen del objeto del constructor que proporcionamos como argumento.

Hemos definido BankAccountBuilder en una clase interna estática:

Observe que «hemos declarado el mismo conjunto de campos que contiene la clase externa. Todos los campos obligatorios son obligatorios como argumentos para el constructor de la clase interna, mientras que los campos opcionales restantes se pueden especificar utilizando los métodos de establecimiento.

Esta implementación también admite el enfoque de diseño fluido al hacer que los métodos de establecimiento devuelvan el constructor. objeto.

Finalmente, el método de construcción llama al constructor privado de la clase externa y se pasa a sí mismo como el argumento. La cuenta bancaria devuelta será instanciada con los parámetros establecidos por BankAccountBuilder.

Veamos un ejemplo rápido del patrón de construcción en acción:

6.2. Cuándo usar el patrón del constructor

  1. Cuando el proceso involucrado en la creación de un objeto es extremadamente complejo, con muchos parámetros obligatorios y opcionales
  2. Cuando un el aumento en el número de parámetros del constructor conduce a una gran lista de constructores
  3. Cuando el cliente espera diferentes representaciones para el objeto que está construido

Conclusión

En este artículo, aprendimos acerca de los patrones de diseño de creación en Java. También discutimos sus cuatro tipos diferentes, es decir, Singleton, Factory Method, Abstract Factory y Builder Pattern, sus ventajas, ejemplos y cuándo debería los usamos.

Como siempre, los fragmentos de código completos están disponibles en GitHub.

Comience con Spring 5 y Spring Boot 2, a través del curso Learn Spring:

> > VER EL CURSO

Leave a Reply

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *