Чем отличается паттерн ‘Фабричный метод’ от ‘Абстрактной фабрики’

Ответ

Ключевое различие заключается в их цели и масштабе: Фабричный метод создает один объект, а Абстрактная фабрика — семейство взаимосвязанных объектов.

Фабричный метод (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()

Итог:

Критерий Фабричный метод Абстрактная фабрика
Продукт Один объект Семейство объектов
Реализация Через наследование (один метод) Через композицию (объект-фабрика)
Иерархия Одна иерархия продуктов Несколько иерархий продуктов