Factory Pattern vs Builder Pattern: сравнение паттернов проектирования

Паттерны проектирования помогают разработчикам создавать гибкие, масштабируемые и понятные архитектуры. Среди порождающих паттернов особенно часто используются Factory Pattern и Builder Pattern. Несмотря на то, что оба паттерна отвечают за создание объектов, они решают разные задачи и подходят для различных ситуаций.
Factory Pattern (Фабричный метод)
Factory Pattern применяется тогда, когда нужно создавать объекты без указания их конкретных классов. Вместо этого используется обобщенный интерфейс или абстрактный класс, а создание конкретных экземпляров делегируется фабрике.
Это удобно, когда:
- Тип создаваемого объекта зависит от условий выполнения.
- Не хочется "засорять" основной код логикой создания объектов.
- Нужно легко добавлять новые типы объектов без изменения клиентского кода.
Пример на Python:
class Shape:
def draw(self):
pass
class Circle(Shape):
def draw(self):
print("Drawing a circle")
class Square(Shape):
def draw(self):
print("Drawing a square")
class ShapeFactory:
@staticmethod
def get_shape(shape_type):
if shape_type == "circle":
return Circle()
elif shape_type == "square":
return Square()
return None
shape = ShapeFactory.get_shape("circle")
shape.draw()
Factory-паттерн полезен при создании объектов, когда есть множество возможных подклассов или вариантов. Однако при большом количестве вариантов фабрика может становиться перегруженной условной логикой.
Builder Pattern (Строитель)
Builder Pattern используется, когда объект сложен в создании, особенно если у него много параметров и они не всегда обязательны. Вместо того чтобы создавать объект напрямую, его "собирают" шаг за шагом.
Это особенно удобно, когда:
- У объекта есть множество опциональных параметров.
- Нужно создавать разные представления одного и того же объекта.
- Требуется сделать процесс создания читаемым и контролируемым.
Пример на Python:
class Car:
def __init__(self):
self.engine = None
self.wheels = None
self.color = None
class CarBuilder:
def __init__(self):
self.car = Car()
def set_engine(self, engine):
self.car.engine = engine
return self
def set_wheels(self, wheels):
self.car.wheels = wheels
return self
def set_color(self, color):
self.car.color = color
return self
def build(self):
return self.car
car = CarBuilder().set_engine("V8").set_wheels(4).set_color("Red").build()
Builder позволяет сконструировать объект гибко и последовательно. При этом код остается чистым и легко читаемым. Этот паттерн особенно полезен, если вы создаете неизменяемые объекты с множеством полей.
Главные различия
Factory Pattern отвечает за то, какой объект создать, и инкапсулирует выбор конкретного класса. Он полезен, когда классов много и клиентский код не должен знать о них.
Builder Pattern отвечает за то, как создать объект, и инкапсулирует пошаговый процесс сборки. Он применяется, когда объект сложный и состоит из множества компонентов или параметров.
Когда использовать
Используйте Factory, если:
- Нужно скрыть логику выбора конкретного класса.
- Тип создаваемого объекта зависит от условий.
Используйте Builder, если:
- Объект имеет много параметров.
- Требуется создавать разные конфигурации одного объекта.
- Нужен чистый и настраиваемый процесс сборки.
Вывод
Factory и Builder — это не конкурирующие, а дополняющие друг друга паттерны. Один отвечает за выбор типа объекта, второй — за его пошаговую конфигурацию. Грамотное понимание различий между ними позволяет использовать их эффективно и в нужный момент.
-
-
Михаил Русаков
Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.