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

Фабричный метод часто используется, когда класс не может предвидеть тип объектов, которые ему необходимо создать, или когда класс хочет делегировать ответственность за создание объектов своим подклассам.