Ответ
Шаблон проектирования Builder (Строитель) — это порождающий паттерн, который позволяет создавать сложные объекты поэтапно, отделяя процесс конструирования от его представления. Это особенно полезно, когда объект имеет множество параметров, сложную внутреннюю структуру или требует различных вариантов конструирования.
Почему используется? Builder решает проблему «телескопического конструктора» (когда у класса слишком много конструкторов с разным набором параметров) и позволяет создавать объекты с гибкой конфигурацией, не перегружая конструктор.
Пример (Python):
Представим, что мы хотим создать объект Pizza
с различными ингредиентами.
class Pizza:
def __init__(self, builder):
self.size = builder.size
self.cheese = builder.cheese
self.pepperoni = builder.pepperoni
self.mushrooms = builder.mushrooms
def __str__(self):
ingredients = []
if self.cheese: ingredients.append("Cheese")
if self.pepperoni: ingredients.append("Pepperoni")
if self.mushrooms: ingredients.append("Mushrooms")
return f"Pizza (Size: {self.size} inch, Ingredients: {', '.join(ingredients) if ingredients else 'None'})"
class PizzaBuilder:
def __init__(self, size):
self.size = size
self.cheese = False
self.pepperoni = False
self.mushrooms = False
def add_cheese(self):
self.cheese = True
return self
def add_pepperoni(self):
self.pepperoni = True
return self
def add_mushrooms(self):
self.mushrooms = True
return self
def build(self):
return Pizza(self)
# Использование Builder для создания пиццы
pizza1 = PizzaBuilder(12).add_cheese().add_pepperoni().build()
print(pizza1) # Output: Pizza (Size: 12 inch, Ingredients: Cheese, Pepperoni)
pizza2 = PizzaBuilder(10).add_cheese().add_mushrooms().build()
print(pizza2) # Output: Pizza (Size: 10 inch, Ingredients: Cheese, Mushrooms)
pizza3 = PizzaBuilder(14).build()
print(pizza3) # Output: Pizza (Size: 14 inch, Ingredients: None)
Преимущества:
- Гибкость: Позволяет создавать различные представления одного и того же продукта, используя один и тот же процесс конструирования.
- Читаемость кода: Улучшает читаемость и поддерживаемость кода, делая процесс создания объекта более явным и пошаговым.
- Изоляция: Инкапсулирует сложную логику построения объекта, скрывая её от клиентского кода.
- Контроль: Позволяет контролировать этапы создания объекта и гарантировать его корректное состояние на каждом шаге.