Перейти к основному содержимому

Что такое паттерн проектирования

Паттерн проектирования (design pattern) — это названное и проверенное решение задачи, которая снова и снова возникает при проектировании программ. Паттерны — это не код, который копируют, а формы, которые узнают: «это задача обёртывания», «это задача оповещения».

Классический каталог содержит 23 паттерна, собранных четырьмя авторами, известными как «Банда четырёх» (Gang of Four). Знание паттернов даёт две вещи: готовые ответы на типичные задачи и общий словарь — фраза «используй здесь адаптер» заменяет целый абзац объяснений.


Три семейства

23 паттерна делятся на три семейства:

Порождающие — как создаются объекты: Одиночка (Singleton), Фабричный метод (Factory Method), Абстрактная фабрика (Abstract Factory), Строитель (Builder), Прототип (Prototype).

Структурные — как части соединяются вместе: Адаптер (Adapter), Мост (Bridge), Компоновщик (Composite), Декоратор (Decorator), Фасад (Facade), Приспособленец (Flyweight), Заместитель (Proxy).

Поведенческие — как части общаются друг с другом: Цепочка обязанностей (Chain of Responsibility), Команда (Command), Интерпретатор (Interpreter), Итератор (Iterator), Посредник (Mediator), Снимок (Memento), Наблюдатель (Observer), Состояние (State), Стратегия (Strategy), Шаблонный метод (Template Method), Посетитель (Visitor).

У каждого паттерна в этой группе есть своя страница: что он собой представляет, один запускаемый пример, когда его использовать, а также его плюсы и минусы.


Паттерны в стиле Python

Каталог был написан для языков, построенных вокруг классов и наследования. В Python есть и то и другое, поэтому паттерны переносятся напрямую — но в нём также есть утиная типизация и функции первого класса, и каждая страница здесь использует их там, где они помогают.

Некоторые паттерны в Python становятся намного проще (стратегия — это просто функция, итератор — это просто генератор); некоторые почти вовсе не нужны. Каждая страница честно об этом говорит.

Одно предупреждение перед началом: паттерны — это инструменты, а не цели. Паттерн там, где хватило бы обычной функции, делает код хуже. Берите паттерн, когда вы ощущаете его проблему, — но никогда не раньше.