Фабричный метод

Фабричный метод (Factory Method) – это порождающий паттерн проектирования, который предоставляет интерфейс для создания объектов в суперклассе, но позволяет подклассам выбирать конкретные классы для создания. Фабричный метод делегирует ответственность за создание объектов наследующим классам, что делает его полезным в ситуациях, когда конкретный тип создаваемого объекта определяется на уровне подклассов.

Основные участники паттерна “Фабричный метод”:

  1. Абстрактный создатель (Creator): Это абстрактный класс или интерфейс, который объявляет фабричный метод. Фабричный метод обычно возвращает объект абстрактного продукта.
  2. Конкретный создатель (Concrete Creator): Это подкласс абстрактного создателя, который реализует фабричный метод. Каждый конкретный создатель может создавать свой собственный конкретный продукт.
  3. Абстрактный продукт (Product): Это абстрактный класс или интерфейс, который объявляет интерфейс для продуктов, создаваемых фабричным методом.
  4. Конкретный продукт (Concrete Product): Это класс, который реализует интерфейс абстрактного продукта и предоставляет конкретную реализацию продукта.

Пример использования паттерна “Фабричный метод” на Python:

python

from abc import ABC, abstractmethod # Абстрактный класс продукта class Product(ABC): @abstractmethod def operation(self): pass # Конкретные классы продуктов class ConcreteProductA(Product): def operation(self): return "Работа ConcreteProductA" class ConcreteProductB(Product): def operation(self): return "Работа ConcreteProductB" # Абстрактный класс создателя class Creator(ABC): @abstractmethod def factory_method(self): pass def some_operation(self): product = self.factory_method() result = f"{product.operation()}" return result # Конкретные классы создателей class ConcreteCreatorA(Creator): def factory_method(self): return ConcreteProductA() class ConcreteCreatorB(Creator): def factory_method(self): return ConcreteProductB() # Использование создателей и продуктов creator_a = ConcreteCreatorA() result_a = creator_a.some_operation() print(result_a) # Вывод: Работа ConcreteProductA creator_b = ConcreteCreatorB() result_b = creator_b.some_operation() print(result_b) # Вывод: Работа ConcreteProductB

В этом примере есть абстрактный класс Product, который определяет интерфейс для продуктов, и два конкретных класса ConcreteProductA и ConcreteProductB, реализующих этот интерфейс. Также есть абстрактный класс Creator, который определяет фабричный метод factory_method, создающий продукт. Конкретные создатели ConcreteCreatorA и ConcreteCreatorB реализуют фабричный метод, чтобы создать конкретные продукты.

Паттерн “Фабричный метод” позволяет легко добавлять новые типы продуктов и создателей, не изменяя существующий код. Это делает его полезным для создания расширяемых и гибких систем.