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 — это не конкурирующие, а дополняющие друг друга паттерны. Один отвечает за выбор типа объекта, второй — за его пошаговую конфигурацию. Грамотное понимание различий между ними позволяет использовать их эффективно и в нужный момент.