Abstract Factory Pattern in Python
Create whole families of matching objects, such as a dark-theme button and checkbox, without naming their classes.
- Product families
- One factory per family
- Swapping the whole family at once
theme factoryDarkThemeFactoryDarkButtonDarkCheckbox
LightThemeFactoryLightButtonLightCheckbox
One factory, one matching family
Abstract Factory - паттерн проектирования для создания целого семейства (family) связанных объектов без указания конкретного класса каждого из них. Например, интерфейсу в тёмной теме нужны кнопки и флажки в одном тёмном стиле, без смешения со светлым.
Главное
- A factory has one method per product:
create_button(),create_checkbox(). - DarkThemeFactory returns dark widgets; LightThemeFactory returns light ones.
- The client receives a factory and never mixes themes by accident.
Когда это нужно?
- Решать повторяющиеся задачи объектного проектирования с помощью проверенных структур.
- Разделять обязанности, чтобы код было проще расширять и тестировать.
- Использовать общую терминологию проектирования при обсуждении архитектуры в команде.
Пример кода
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.
Упражнения для практики
Попробуйте изменить код по подсказкам ниже. Если менять код и смотреть на результат, урок запомнится гораздо лучше, чем при простом чтении.
- Замените предметную область примера, сохранив структуру паттерна.
- Сравните паттерн с более простой реализацией и объясните компромиссы.
- Напишите тесты для каждого участника перед добавлением новой реализации.