Паттерны проектирования в Python
Паттерны проектирования это готовые эффективные решения для задач, которые часто встречаются в практике программиста. Это шаблон решения, по которому вы сможете решить возникшую проблему, внеся небольшие частные изменения в существующий паттерн.
Например, если мы производим автомобили, нам незачем каждый раз изобретать колесо или топливную систему, достаточно посмотреть, как они реализованы в других автомобилях и адаптивать их под свои нужды. Шаблоны проектирования не зависят от языка программирования, соответственно любой из них может быть реализован не только в 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 | Шаблон, позволяющий выполнять операции над другими объектами, без необходимости изменять эти объекты. |
Правильное применение шаблонов проектирования может в значительной мере упростить разработку программы и ее дальнейшую поддержку и расширение. В то же время, бездумное использование паттернов проектирования лишь без надобности усложнит и перегрузит созданную систему. Опыт эффективного использования того или иного шаблона приходит лишь со временем, так что не бойтесь практиковаться и эксперементировать.