Паттерны проектирования в Python
Классические паттерны, переписанные по-питонически: модули, функции первого класса и протоколы
- объяснить, почему модуль Python уже является синглтоном;
- заменить иерархию классов-фабрик словарём-реестром вызываемых объектов;
- реализовать паттерн Стратегия, просто передав функцию;
- построить Наблюдателя на основе списка функций-подписчиков;
- использовать
typing.Protocolдля структурной типизации вместо ABC.
1. Что такое паттерн - и особенность Python
Паттерн - это не библиотека и не возможность языка; это форма решения, которая снова и снова повторяется. Названия этих форм дают команде общий словарь: сказать "давайте используем здесь Стратегию" - значит передать целый замысел в двух словах.
Подвох в том, что многие учебные паттерны существуют, чтобы обходить ограничения статических языков, где есть только классы. В таких языках нельзя передавать функцию, поэтому её оборачивают в объект с единственным методом. Python умеет передавать функции, хранить их в словарях и менять поведение во время выполнения, поэтому обёртка-объект часто оказывается лишней церемонией. Профессиональная привычка - брать самый простой инструмент, выражающий замысел, и добавлять классы только когда они оправданы.
| Паттерн | Классическая ООП-форма | Питоническая форма |
|---|---|---|
| Синглтон | класс, скрывающий свой конструктор | модуль (уже единственный на процесс) |
| Фабрика | иерархия классов-создателей | словарь-реестр вызываемых объектов |
| Стратегия | интерфейс стратегии + конкретные классы | передача функции первого класса |
| Наблюдатель | интерфейсы субъекта и наблюдателя | список функций-подписчиков |