Паттерн Builder: Поэтапное создание объекта во времени

Введение

В прошлой статье рассматривался общий случай использования паттерна Builder, но не затрагивался вариант, когда объект создается поэтапно во времени.
Паттерн Builder (Строитель) – это порождающий шаблон проектирования, который позволяет поэтапно создавать сложные объекты. Он особенно полезен, когда объект имеет много параметров или различных конфигураций. Одним из интересных примеров его использования является возможность разделения процесса создания объекта по времени.
Иногда объект нельзя создать сразу – его параметры могут становиться известными на разных этапах выполнения программы.

Пример на Python

В этом примере объект автомобиля создается поэтапно: сначала часть данных загружается с сервера, затем пользователь вводит недостающую информацию.

import requests

def fetch_car_data():
    response = requests.get("https://api.example.com/car-info")
    return response.json()

builder = CarBuilder()

# Backend API data
car_data = fetch_car_data()
builder.set_model(car_data["model"])
builder.set_year(car_data["year"])

# User input
color = input("Car color: ")
builder.set_color(color)

gps_option = input("GPS feature? (yes/no): ").lower() == "yes"
builder.set_gps(gps_option)

car = builder.build()
print(car)

Представьте что вызов api, ввод данных происходят в разных частях приложения, или даже в разных библиотеках. Тогда использование паттерна Builder становится более очевидным, чем в простом примере выше.

Преимущества

– На выходе получается иммутабельная структура, которой не требуется хранить опциональные данные для временной сборки
– Объект собирается постепенно
– Избежание сложных конструкторов
– Код сборки объекта инкапсулируется лишь в одной сущности Builder
– Удобство понимания кода

Источники

https://www.amazon.com/Design-Patterns-Object-Oriented-Addison-Wesley-Professional-ebook/dp/B000SEIBB8
https://demensdeum.com/blog/2019/09/23/builder-pattern/