Don't learn to code. Code to learn!

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

Hits: 39486

Паттерны проектирования это готовые эффективные решения для задач, которые часто встречаются в практике программиста. Это шаблон решения, по которому вы сможете решить возникшую проблему, внеся небольшие частные изменения в существующий паттерн.

Например, если мы производим автомобили, нам незачем каждый раз изобретать колесо или топливную систему, достаточно посмотреть, как они реализованы в других автомобилях и адаптивать их под свои нужды. Шаблоны проектирования не зависят от языка программирования, соответственно любой из них может быть реализован не только в Python, но и в любом другом языке программирования.

Обычно выделяют следующие группы шаблонов проектирования:


Порождающие шаблоны проектирования

Порождающие шаблоны проектирования связаны с механизмом создания новых объектов. Они призваны обеспечить ситуативную гибкость при создании объекта. Возвращаясь к примеру с машинами, сделать так, чтобы нам не нужно было строить новый завод каждый раз, когда мы хотим выпустить новую модель, вместо этого мы слегка видоизменим уже существующие процессы.
К порождающим шаблонам относятся


Абстрактная фабрика Abstract Factory Позволяет создавать семейства взаимосвязанных или взаимозависимых объектов, без указания их конкретных классов.
Строитель Builder Интерфейс для пошагового создания сложных объектов.
Фабричный метод Factory Method Общий интерфейс для создания объектов в суперклассе, позволяющий подклассам определять тип создаваемого объекта.
Объектный пул Object Pool Позволяет использовать уже созданный объект вместо создания нового, в ситуации, когда создание нового объекта требует большого количества ресурсов.
Прототип Prototype Позволяет копировать объекты без необходимости учитывать особенности их реализации.
Одиночка Singleton Гарантирует, что у класса есть только один экземпляр и предоставляет глобальную точку доступа к нему.
Отложенная инициализация Lazy initialization Создание объекта, непосредственно перед его использованием.
Мультитон Multiton Шаблон позволяющий создавать несколько одиночек (Singleton), доступ и управление которыми производится через ассоциативную таблицу, например словарь.

Струкурные шаблоны проектирования

Структурные шаблоны проектирования определяют метод сборки объектов и классов в более сложные структуры, сохраняя при этом гибкость и эффективность. Для машины это будут перечень деталей, схемы и порядок сборки автомобиля. К структурным шаблонам относятся.


Адаптер Adapter Создание объекта-посредника, который позволит взаимодействовать двум несовместимым объектам.
Мост Bridge Разделяет класс на отдельные части: внешнюю абстракцию и внутреннюю реализацию.
Компоновщик Composite Идея состоит в том, что группа объектов (контейнер) и сам объект (содержимое контейнера) обладают тем же набором свойств, что позволяет работать с группой как с целым объектом.
Декоратор Decorator Добавляет, убирает или изменяет поведение декорированного объекта.
Фасад Facade Обертка сложной системы, модуля, пакета в простой интерфейс.
Приспособленец Flyweight Использование совместных ресурсов для похожих объектов, вместо выделения ресурсов для каждого объекта по отдельности.
Прокси Proxy Создание объекта-подложки для реального объекта, чтобы контролировать обращения к нему, изменять или перенаправлять их.

Поведенческие шаблоны проектирования

Поведенческие шаблоны определяют взаимодействие между классами и объектами, их обязанностями и алгоритмы поведения. На автозаводе это будут логистика и распределение обязанностей, построение коммуникации между разными департаментами и отделами.
К поведенческим шаблонам относят.


Цепочка обязанностей Chain of responsibility Последовательная передача запросов по списку объектов, которые эти запросы обрабатывают и/или передают дальше по цепочке. 
Итератор Iterator Позволяет последовательно получать объекты из контейнера, не раскрывая особенности реализации контейнера. В Python доступен на встроенном уровне.
Команда Command Добавляет слой абстракции между действием и объектом, который это действие вызывает, например, кнопка и действие, которое выполняется при нажатии на эту кнопку.
Посредник Mediator Создание такой структуры, в которой объекты не общаются друг с другом, а используют для этого объект-посредник.
Хранитель Memento Сохраняет состояние объекта на определенный момент для того, чтобы при необходимости к нему можно было вернуться.
Null Object Null Object Объект который может использоваться в случае отсутствия нужного объекта или объект по умолчанию.
Наблюдатель Observer Объект "наблюдающий" за состоянием других объектов, информирующий систему / пользователя про изменения состояния наблюдаемого объекта, например пуш-извещения.
Состояние State Позволяет изменять поведение объекта в зависимости от его состояния. 
Стратегия Strategy Позволяет объединить несколько алгоритмов в группу. Порядок применения алгоритмов может изменяться, благодаря чему достигается гибкость всей системы.
Шаблонный метод Template method Создание базовых методов и алгоритма их применения в абстрактном родительском классе с тем, чтобы определить конкретные методы в дочерних классах.
Посетитель Visitor Шаблон, позволяющий выполнять операции над другими объектами, без необходимости изменять эти объекты.

Правильное применение шаблонов проектирования может в значительной мере упростить разработку программы и ее дальнейшую поддержку и расширение. В то же время, бездумное использование паттернов проектирования лишь без надобности усложнит и перегрузит созданную систему. Опыт эффективного использования того или иного шаблона приходит лишь со временем, так что не бойтесь практиковаться и эксперементировать.