Идея

Первоначальная идея паттерна Builder — возможность создания сложных объектов с максимально широкой вариацией конфигураций, альтернатива паттерну Factory Method.


Контекст

У нас в компании несколько отделов и мы собираемся создавать пользователей и распределять их в них.

Как мы можем с помощью кода создать способ централизовать это творение и передать соответствующие настройки различным пользователям? Строитель!!!

Создание типов и нашего класса User.

export type UserInfo = {
    name: string
    age: number
    departament: string
    salary: number
}

export class User {
    name=""
    age = 0
    departament=""
    salary = 0

    create() {
        console.log({
            name: this.name,
            age: this.age,
            departament: this.departament,
            salary: this.salary
        })
    }
}
Войти в полноэкранный режим

Выйти из полноэкранного режима

_
Создание протокола, который должен реализовать конкретный класс Builder._


import { User } from ".."

export interface UserBuilder {
    setName(name: string): this
    setAge(age: number): this
    setDepartament(departament: string): this
    setSalary(salary: number): this
    getUser(): User
}
Войти в полноэкранный режим

Выйти из полноэкранного режима

Создание нашего конкретного класса UserBuilder.

import { User } from ".."
import { UserBuilder } from "../protocols/user-builder-protocol"

export class ConcreteUserBuilder implements UserBuilder {
    user: User

    constructor() {
        this.user = new User()
    }

    setName(name: string): this {
        this.user.name =  name
        return this
    }

    setAge(age: number): this {
        this.user.age =  age
        return this
    }

    setDepartament(departament: string): this {
        this.user.departament =  departament
        return this
    }

    setSalary(salary: number): this {
        this.user.salary =  salary
        return this
    }

    getUser(): User {
        return this.user
    }
}

Войти в полноэкранный режим

Выйти из полноэкранного режима

_
Реализация создания новых пользователей._


import { ConcreteUserBuilder } from "../builder/user-builder"

class EngineerUser {
    static buildUser() {
        return new ConcreteUserBuilder()
            .setName('Gabriel Valin')
            .setAge(23)
            .setDepartament('Engineering')
            .setSalary(99999999) //hahahaha :D
            .getUser() 
    }
}

class MarketingUser {
    static buildUser() {
        return new ConcreteUserBuilder()
            .setName('Thais Valin')
            .setAge(19)
            .setDepartament('Marketing')
            .setSalary(8888888) //hahahaha :D
            .getUser() 
    }
}

const newEngineer = EngineerUser.buildUser()
const newMarketing = MarketingUser.buildUser()

newMarketing.create()
newEngineer.create()
Войти в полноэкранный режим

Выйти из полноэкранного режима

Результат:

{
  name: 'Thais Valin',
  age: 19,
  departament: 'Marketing',
  salary: 8888888
}
{
  name: 'Gabriel Valin',
  age: 23,
  departament: 'Engineering',
  salary: 99999999
}
Войти в полноэкранный режим

Выйти из полноэкранного режима


Вывод

Это был упрощенный способ показать, как использовать Конструктор паттернов.

Отличный способ понять этот шаблон — представить себе строительство дома, где мы определяем в основном классе (Пользователь), что у него будут какие-то свойства (окна, двери, количество санузлов, спален и т.д.), после чего мы должны сказать застройщику, что дом должен быть построен с соблюдением принятого строительного стандарта (интерфейс UserBuilder), наконец, строительная компания создаст и разделит между сотрудниками строительные функции, которые в итоге сгенерируют готовый дом (БетонПользовательСтроитель).

Благодаря этому строительная компания всегда может создавать сложные дома, без особого труда определяя их свойства. (Инженер-пользователь, маркетолог-пользователь). 😀

Ссылки для более глубокого изучения: