Hoy veremos el patrón Builder en Java. El patrón de diseño Builder es un patrón de diseño de creación, como el patrón Factory y el patrón Abstract Factory .
Patrón de diseño del constructor
El patrón Builder se introdujo para resolver algunos de los problemas con los patrones de diseño Factory y Abstract Factory cuando el objeto contiene muchos atributos. Existen tres problemas principales con los patrones de diseño Factory y Abstract Factory cuando el objeto contiene muchos atributos.
- Demasiados argumentos para pasar del programa cliente a la clase Factory, lo que puede ser propenso a errores porque la mayoría de las veces, los tipos de argumentos son los mismos y desde el lado del cliente es difícil mantener el orden de los argumentos.
- Algunos de los parámetros pueden ser opcionales, pero en el patrón Factory, estamos obligados a enviar todos los parámetros y los parámetros opcionales deben enviarse como NULL.
- Si el objeto es pesado y su creación es compleja, entonces toda esa complejidad será parte de las clases de Factory, lo cual resulta confuso.
Podemos resolver los problemas con una gran cantidad de parámetros proporcionando un constructor con los parámetros requeridos y luego diferentes métodos de configuración para configurar los parámetros opcionales. El problema con este enfoque es que el estado del objeto será inconsistente hasta que todos los atributos se configuren explícitamente. El patrón Builder resuelve el problema con una gran cantidad de parámetros opcionales y un estado inconsistente al proporcionar una manera de construir el objeto paso a paso y proporcionar un método que realmente devolverá el objeto final.
Patrón de diseño Builder en Java
Veamos cómo podemos implementar el patrón de diseño de constructor en Java.
- En primer lugar, debe crear una clase anidada estática y luego copiar todos los argumentos de la clase externa a la clase Builder. Debemos seguir la convención de nombres y, si el nombre de la clase es ,
Computerentonces la clase Builder debe llamarse asíComputerBuilder. - La clase Java Builder debe tener un constructor público con todos los atributos requeridos como parámetros.
- La clase Java Builder debe tener métodos para establecer los parámetros opcionales y debe devolver el mismo objeto Builder después de establecer el atributo opcional.
- El paso final es proporcionar un
build()método en la clase constructora que devolverá el objeto que necesita el programa cliente. Para ello, necesitamos tener un constructor privado en la clase con la clase constructora como argumento.
Aquí está el código de ejemplo de patrón de construcción de muestra donde tenemos una clase Computer y una clase ComputerBuilder para construirlo.
package com.journaldev.design.builder;public class Computer {//required parametersprivate String HDD;private String RAM;//optional parametersprivate boolean isGraphicsCardEnabled;private boolean isBluetoothEnabled;public String getHDD() {return HDD;}public String getRAM() {return RAM;}public boolean isGraphicsCardEnabled() {return isGraphicsCardEnabled;}public boolean isBluetoothEnabled() {return isBluetoothEnabled;}private Computer(ComputerBuilder builder) {this.HDD=builder.HDD;this.RAM=builder.RAM;this.isGraphicsCardEnabled=builder.isGraphicsCardEnabled;this.isBluetoothEnabled=builder.isBluetoothEnabled;}//Builder Classpublic static class ComputerBuilder{// required parametersprivate String HDD;private String RAM;// optional parametersprivate boolean isGraphicsCardEnabled;private boolean isBluetoothEnabled;public ComputerBuilder(String hdd, String ram){this.HDD=hdd;this.RAM=ram;}public ComputerBuilder setGraphicsCardEnabled(boolean isGraphicsCardEnabled) {this.isGraphicsCardEnabled = isGraphicsCardEnabled;return this;}public ComputerBuilder setBluetoothEnabled(boolean isBluetoothEnabled) {this.isBluetoothEnabled = isBluetoothEnabled;return this;}public Computer build(){return new Computer(this);}}}
Tenga en cuenta que la clase Computer solo tiene métodos getter y ningún constructor público. Por lo tanto, la única forma de obtener un objeto Computer es a través de la clase ComputerBuilder. Aquí hay un programa de prueba de ejemplo de patrón de constructor que muestra cómo usar la clase Builder para obtener el objeto.
package com.journaldev.design.test;import com.journaldev.design.builder.Computer;public class TestBuilderPattern {public static void main(String[] args) {//Using builder to get the object in a single line of code and //without any inconsistent state or arguments management issuesComputer comp = new Computer.ComputerBuilder("500 GB", "2 GB").setBluetoothEnabled(true).setGraphicsCardEnabled(true).build();}}
Videotutorial de patrones de diseño de Builder
Recientemente subí un video a YouTube sobre el patrón de diseño Builder. También expliqué por qué creo que el patrón Builder definido en Wikipedia usando clases Director no es un enfoque orientado a objetos muy bueno, y cómo podemos lograr el mismo nivel de abstracción usando un enfoque diferente y con una clase. Tenga en cuenta que este es mi punto de vista, creo que los patrones de diseño están para guiarnos, pero en última instancia tenemos que decidir si es realmente beneficioso implementarlo en nuestro proyecto o no. Soy un firme creyente del principio KISS . https://www.youtube.com/watch?v=D5NK5qMM14g Si te gusta el video, compártelo, dale me gusta y suscríbete a mi canal. Si crees que estoy equivocado o tienes algún comentario o sugerencia para que pueda mejorar mis videos en el futuro, házmelo saber a través de los comentarios aquí o en la página de videos de YouTube.
Ejemplo de patrón de diseño de constructor en JDK
Algunos de los ejemplos de patrones de construcción en clases Java son:
- java.lang.StringBuilder#append() (no sincronizado)
- java.lang.StringBuffer#append() (sincronizado)
Eso es todo sobre el patrón de diseño de constructor en Java.
Puedes descargar el código de ejemplo desde mi repositorio de GitHub .