Ответ
Ключевое различие заключается в их цели и масштабе: Фабричный метод создает один объект, а Абстрактная фабрика — семейство взаимосвязанных объектов.
Фабричный метод (Factory Method)
Это порождающий паттерн, который определяет интерфейс для создания одного объекта, но позволяет подклассам изменять тип создаваемого объекта.
- Цель: Делегировать создание экземпляров подклассам.
- Аналогия: Специализированный цех, который производит один тип продукта (например, только кнопки).
Пример: Создание разных типов логгеров.
class Logger:
def log(self, message): pass
class FileLogger(Logger): ...
class ConsoleLogger(Logger): ...
# Фабричный метод в создателе
class LoggerFactory:
def create_logger(self) -> Logger:
# Логика выбора логгера
return FileLogger()
Абстрактная фабрика (Abstract Factory)
Это порождающий паттерн, который предоставляет интерфейс для создания семейств взаимосвязанных объектов, не специфицируя их конкретные классы.
- Цель: Гарантировать, что создаваемые объекты из разных семейств совместимы друг с другом.
- Аналогия: Целый завод, который производит полный набор совместимых продуктов (например, UI-элементы для Windows:
WinButton
,WinCheckbox
).
Пример: Создание UI-элементов для разных ОС.
class GUIFactory:
def create_button(self): pass
def create_checkbox(self): pass
class WindowsFactory(GUIFactory):
def create_button(self): return WinButton()
def create_checkbox(self): return WinCheckbox()
class MacFactory(GUIFactory):
def create_button(self): return MacButton()
def create_checkbox(self): return MacCheckbox()
Итог:
Критерий | Фабричный метод | Абстрактная фабрика |
---|---|---|
Продукт | Один объект | Семейство объектов |
Реализация | Через наследование (один метод) | Через композицию (объект-фабрика) |
Иерархия | Одна иерархия продуктов | Несколько иерархий продуктов |