Implementación del Patrón Builder en Producción de Coches

Clase 19 de 27Curso de Patrones de Diseño en JavaScript

Resumen

¿Qué es el patrón Builder y cómo se aplica a la producción de coches?

El patrón Builder es una de las técnicas más efectivas para manejar construcciones complejas en programación. En este contexto, implementamos el patrón Builder en la línea de producción de coches. Su objetivo principal es simplificar el proceso de creación de objetos complejos mediante la separación del proceso de creación en pasos pequeños y manejables. Aquí encontrarás los detalles de cómo se implementa este patrón en la producción de vehículos, utilizando específicamente JavaScript.

¿Cómo se define la clase base o interfaz Builder?

El primer paso para implementar el patrón Builder es definir una clase base o una interfaz que estipule los pasos generales para construir productos específicos. Para el contexto de producción de coches, definimos la clase CarProductionLine con métodos esenciales como la configuración de las bolsas de aire, el color y la edición del automóvil. Aquí un ejemplo de código:

class CarProductionLine {
    setAirbags(howMany) {
        throw new Error('Método no implementado');
    }
    setColor(color) {
        throw new Error('Método no implementado');
    }
    setEdition(edition) {
        throw new Error('Método no implementado');
    }
    resetProductionLine() {
        throw new Error('Método no implementado');
    }
}

Cada método en nuestra clase base arroja un error si no se implementa, asegurando que todas las clases constructoras deben definir estos métodos.

¿Cómo implementamos los builders concretos?

El segundo paso es implementar builders concretos para ofrecer diferentes implementaciones de los pasos definidos en la clase base. Por ejemplo, en la fábrica de sedanes creamos la clase SedanProductionLine que proporciona implementaciones concretas para el proceso de producción:

class SedanProductionLine extends CarProductionLine {
    setAirbags(howMany) {
        this.sedanCar.airbags = howMany;
        return this;
    }

    setColor(color) {
        this.sedanCar.color = color;
        return this;
    }

    setEdition(edition) {
        this.sedanCar.edition = edition;
        return this;
    }

    resetProductionLine() {
        const model = this.internalModel;
        this.sedanCar = model === 'Mastodon' ? new Mastodon() : new Rhino();
    }
}

Gracias al uso de this, podemos encadenar métodos de manera elegante y eficiente, facilitando la personalización del vehículo.

¿Cuál es la finalidad de la clase director y cómo se usa?

La clase director tiene la responsabilidad de conocer y definir el proceso exacto para construir las variaciones del producto. Así, se establece un orden en los pasos de construcción. Aquí se muestra cómo configuramos un director para gestionar la construcción de diferentes ediciones de coches:

class Director {
    setBuilder(builder) {
        this.productionLine = builder;
    }

    constructCVTEdition() {
        this.productionLine.setAirbags(4).setColor('Azul').setEdition('CVT');
    }

    constructSignatureEdition() {
        this.productionLine.setAirbags(8).setColor('Rojo').setEdition('Signature');
    }
}

El director garantiza que se sigan los pasos en un orden particular y permite la reutilización del mismo builder para diferentes configuraciones de productos.

¿Cómo se gestiona la creación de productos finales?

Impulsado por el director, el builder es capaz de ensamblar el producto y entregarlo ya configurado, manteniendo el estado del proceso y asegurando que el producto esté listo para ser utilizado:

const director = new Director();
const mastodonProductionLine = new SedanProductionLine('Mastodon');
director.setBuilder(mastodonProductionLine);
director.constructCVTEdition();

const mastodonCar = mastodonProductionLine.build();
console.log(mastodonCar);

El método build retorna el coche resultado de la configuración asignada, mostrando cómo los diversos métodos de construcción afectan al producto final.

¿Qué aporta el patrón Builder al desarrollo de software?

Implementar el patrón Builder no solo organiza el código sino que permite manejar de manera flexible la creación de objetos complejos, reduciendo el riesgo de errores y ofreciendo un código más mantenible. Mediante la separación de las acciones de construcción en varias clases, incluyendo los builders y el director, las responsabilidades están claramente definidas y desacopladas. Además, esta estructura es especialmente valiosa cuando se espera que los productos entren y salgan del proceso de producción de diferentes maneras en función de ciertos parámetros.

¡Ahora es tu turno de aplicar el patrón Builder y ver cómo se adapta a tus necesidades de desarrollo! Recuerda, la práctica es clave para dominar cualquier metodología de programación. ¡Sigue adelante y sigue construyendo!