Назад к вопросам
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)