Фабричный метод (Factory Method) – это порождающий паттерн проектирования, который предоставляет интерфейс для создания объектов в суперклассе, но позволяет подклассам выбирать конкретные классы для создания. Фабричный метод делегирует ответственность за создание объектов наследующим классам, что делает его полезным в ситуациях, когда конкретный тип создаваемого объекта определяется на уровне подклассов.
Основные участники паттерна “Фабричный метод”:
- Абстрактный создатель (Creator): Это абстрактный класс или интерфейс, который объявляет фабричный метод. Фабричный метод обычно возвращает объект абстрактного продукта.
- Конкретный создатель (Concrete Creator): Это подкласс абстрактного создателя, который реализует фабричный метод. Каждый конкретный создатель может создавать свой собственный конкретный продукт.
- Абстрактный продукт (Product): Это абстрактный класс или интерфейс, который объявляет интерфейс для продуктов, создаваемых фабричным методом.
- Конкретный продукт (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
реализуют фабричный метод, чтобы создать конкретные продукты.
Паттерн “Фабричный метод” позволяет легко добавлять новые типы продуктов и создателей, не изменяя существующий код. Это делает его полезным для создания расширяемых и гибких систем.