Назад к вопросам
Middle+
73
questionbank
Что такое Фабричный метод (Factory Method)?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Фабричный метод — это порождающий шаблон проектирования, который определяет интерфейс для создания объекта, но позволяет подклассам изменять тип создаваемого объекта. Он инкапсулирует логику создания объекта в отдельный метод, который вызывается клиентским кодом. Это позволяет отделить код, использующий объекты, от кода, создающего их.
Ключевые компоненты:
- Creator (Создатель): Объявляет фабричный метод, который возвращает объект Product. Этот класс может иметь реализацию по умолчанию для фабричного метода.
- Concrete Creator (Конкретный Создатель): Переопределяет фабричный метод для возврата конкретного объекта Concrete Product.
- Product (Продукт): Определяет интерфейс объектов, которые создает фабричный метод.
- Concrete Product (Конкретный Продукт): Конкретная реализация интерфейса Product.
Преимущества:
- Уменьшает связанность между классами, использующими и создающими объекты.
- Позволяет добавлять новые типы продуктов без изменения клиентского кода.
- Способствует принципу открытости/закрытости (Open/Closed Principle).
Пример:
# Интерфейс Продукта
class Product:
def operation(self):
pass
# Конкретный Продукт A
class ConcreteProductA(Product):
def operation(self):
return "Результат ConcreteProductA"
# Конкретный Продукт B
class ConcreteProductB(Product):
def operation(self):
return "Результат ConcreteProductB"
# Интерфейс Создателя
class Creator:
def factory_method(self):
pass
def some_operation(self):
# Создатель обычно содержит логику, которая зависит от объектов Product.
# Конкретный Продукт создается через фабричный метод.
product = self.factory_method()
# Вызывается операция Продукта
result = f"Creator: Та же логика работает с {product.operation()}"
return result
# Конкретный Создатель A переопределяет фабричный метод для создания ConcreteProductA
class ConcreteCreatorA(Creator):
def factory_method(self):
return ConcreteProductA()
# Конкретный Создатель B переопределяет фабричный метод для создания ConcreteProductB
class ConcreteCreatorB(Creator):
def factory_method(self):
return ConcreteProductB()
# Клиентский код
def client_code(creator):
print(f"Client: Я не осведомлен о классе создателя, но это все равно работает.\n"
f"{creator.some_operation()}")
Фабричный метод часто используется, когда класс не может предвидеть тип объектов, которые ему необходимо создать, или когда класс хочет делегировать ответственность за создание объектов своим подклассам.