Паттерны проектирования Python

Abstract Factory Pattern in Python

Create whole families of matching objects, such as a dark-theme button and checkbox, without naming their classes.

  • Продвинутый
  • Чтение: 2 мин
  • Примеров для запуска: 1
Что вы узнаете
  • Product families
  • One factory per family
  • Swapping the whole family at once
Theme factories
  • theme factory
    • DarkThemeFactory
      • DarkButton
      • DarkCheckbox
    • LightThemeFactory
      • LightButton
      • LightCheckbox

One factory, one matching family

Abstract Factory - паттерн проектирования для создания целого семейства (family) связанных объектов без указания конкретного класса каждого из них. Например, интерфейсу в тёмной теме нужны кнопки и флажки в одном тёмном стиле, без смешения со светлым.

Главное

  1. A factory has one method per product: create_button(), create_checkbox().
  2. DarkThemeFactory returns dark widgets; LightThemeFactory returns light ones.
  3. The client receives a factory and never mixes themes by accident.

Когда это нужно?

  • Решать повторяющиеся задачи объектного проектирования с помощью проверенных структур.
  • Разделять обязанности, чтобы код было проще расширять и тестировать.
  • Использовать общую терминологию проектирования при обсуждении архитектуры в команде.

Пример кода

Запустить код →
main.py
class DarkButton:
    # Abstract Factory: create products that belong to one family.
    def render(self): return "Dark button"


class DarkCheckbox:
    def render(self): return "Dark checkbox"


class DarkThemeFactory:
    # Produce a compatible family of UI objects.
    def create_button(self): return DarkButton()
    def create_checkbox(self): return DarkCheckbox()


factory = DarkThemeFactory()
print(factory.create_button().render())
print(factory.create_checkbox().render())
Получить кнопку запуска для этого примера

Результат выполнения

Dark button
Dark checkbox

Разбор кода

Каждая фабрика создаёт набор из кнопки и флажка в одном стиле: например, фабрика тёмной темы создаёт DarkButton и DarkCheckbox. Использующий код работает только с фабрикой, поэтому никогда случайно не смешает компоненты двух разных стилей.

Измените значения и запустите программу в онлайн-компиляторе Python CodeUtility без локальной установки Python.

Упражнения для практики

Попробуйте изменить код по подсказкам ниже. Если менять код и смотреть на результат, урок запомнится гораздо лучше, чем при простом чтении.

  1. Замените предметную область примера, сохранив структуру паттерна.
  2. Сравните паттерн с более простой реализацией и объясните компромиссы.
  3. Напишите тесты для каждого участника перед добавлением новой реализации.
Запустить в компиляторе Python →