Назад к вопросам
Middle
62
questionbank

Что такое паттерн проектирования 'Строитель' (Builder)?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

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

Основные компоненты:

  • Builder: Интерфейс или абстрактный класс, определяющий шаги для создания частей продукта.
  • ConcreteBuilder: Конкретная реализация Builder, которая выполняет шаги построения и предоставляет метод для получения готового продукта. Содержит ссылку на создаваемый объект Product.
  • Product: Сложный объект, который строится.
  • Director: (Не всегда обязателен) Определяет порядок выполнения шагов построения. Может управлять процессом создания конкретного объекта с помощью Builder.

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

  • Позволяет создавать сложные объекты пошагово, что упрощает код и делает его более читабельным.
  • Позволяет получать различные представления одного и того же процесса построения.
  • Изолирует код построения от предметной логики объекта.

Пример:

# Продукт
class House:
    def __init__(self):
        self.walls = 0
        self.windows = 0
        self.doors = 0
        self.roof = False

    def __str__(self):
        return f"Дом с {self.walls} стенами, {self.windows} окнами, {self.doors} дверями и крышей: {self.roof}"

# Интерфейс строителя
class HouseBuilder:
    def reset(self):
        pass

    def build_walls(self, count):
        pass

    def build_windows(self, count):
        pass

    def build_doors(self, count):
        pass

    def build_roof(self):
        pass

    def get_result(self):
        pass

# Конкретный строитель
class StoneHouseBuilder(HouseBuilder):
    def __init__(self):
        self._house = House()

    def reset(self):
        self._house = House()

    def build_walls(self, count):
        self._house.walls = count

    def build_windows(self, count):
        self._house.windows = count

    def build_doors(self, count):
        self._house.doors = count

    def build_roof(self):
        self._house.roof = True

    def get_result(self):
        return self._house

# Директор (необязателен)
class Director:
    def construct_simple_house(self, builder):
        builder.reset()
        builder.build_walls(4)
        builder.build_windows(2)
        builder.build_doors(1)
        builder.build_roof()

# Использование
builder = StoneHouseBuilder()
director = Director()

director.construct_simple_house(builder)
simple_house = builder.get_result()
print(simple_house)

# Можно строить дом по-другому без директора
builder.reset()
builder.build_walls(6)
builder.build_windows(4)
builder.build_doors(2)
complex_house = builder.get_result()
print(complex_house)