Паттерн проектирования - это решение определенной задачи при проектировании архитектуры программы.
Паттерн нельзя просто скопировать в программу. Он представляет собой общую концепцию решения проблемы, которую нужно подстроить под требования Вашей программы.
Их часто путают с алгоритмами. Но если алгоритм — это определенный набор действий, то паттерн — высокоуровневое решение, реализация которого может отличаться.
Можно заниматься разработкой, не зная паттернов. Возможно, Вы уже не раз реализовали какой-то из паттернов, даже не догадываясь об этом. Но осознанное владение отличает профессионала от любителя. Зачем же знать паттерны?
- Решения, проверенные годами. При использовании готовых решений временные затраты значительно уменьшаются.
- Стандартизированный код. При использовании типовых решений, меньше ошибок в архитектуре программы, так как все проблемы уже давно найдены.
- Сленг программистов. По названию паттерна другие разработчики быстрее поймут ваш код, и им не нужно будет объяснять, какие модули за что отвечают.
Классификация паттернов.
Паттерны отличаются между собой по уровню сложности, детализации и размеру проектируемой системы.
Простые — идиомы. Они не универсальны, так как применяются только в рамках одного языка программирования.
Универсальные — архитектурные паттерны. Их можно реализовать практически на любом языке. Они нужны для проектирования всей архитектуры вцелом.
Также паттерны отличаются назначением:
- Порождающие паттерны - гибкое создание объектов и отсутствие необходимости внесения лишних зависимостей. Отвечают за удобное и безопасное создание объектов.
- Структурные паттерны - различные варианты определения связей между объектами. Отвечают за построение удобной иерархии классов.
- Поведенческие паттерны - коммуникация между объектами. Отвечают за решение задач, связанных с эффективным и безопасным взаимодействием объектов программы.
К порождающим паттернам относятся:
- Фабричный метод (Factory Method) - определяет единый интерфейс для создания объектов в суперклассе, при этом позволяет подклассам изменять их тип.
- Абстрактная фабрика (Abstract Factory)- предоставляет возможность создавать группы связанных объектов, не привязываясь к конкретным классам.
- Строитель (Builder) - создает сложные объекты итеративно. Также дает возможность использовать один и тот же код для получения разных представлений объектов.
- Прототип (Prototype)- копирует объекты, не вдаваясь в подробности их реализации.
- Одиночка (Singleton)- гарантирует, что у класса есть только один экземпляр, и предоставляет к нему глобальную точку доступа.
К структурным паттернам относятся:
- Адаптер (Adapter)- позволяет объектам с несовместимыми интерфейсами работать вместе.
- Мост (Bridge)- разделяет классы на две отдельные иерархии - абстракцию и реализацию, позволяя изменять их независимо друг от друга.
- Компоновщик (Composite) - группирует множество объектов в древовидную структуру, а затем работает с ней, как с единичным объектом.
- Декоратор (Decorator) - позволяет динамически добавлять объектам новую функциональность, используя “обёртки”.
- Фасад (Facade)- предоставляет интерфейс системе классов, библиотеке или фреймворку.
- Легковес/Приспособленец (Flyweight)- позволяет вместить большее количество объектов в выделенную память. Экономит её, разделяя общее состояние, вместо хранения одинаковых данных в каждом объекте.
- Заместитель (Proxy) - подставляет вместо реальных специальные объекты-заменители. Они перехватывают вызовы к оригиналу, позволяя сделать что-то до или после передачи вызова.
К поведенческим паттернам относятся:
- Цепочка обязанностей (Chain of Responsibility)- передает запросы последовательно по цепочке обработчиков. Каждый последующий решает, может ли он обработать запрос сам и стоит ли передать запрос дальше.
- Команда (Command)- преобразует запросы в объекты, позволяя передавать их как аргументы при вызове методов, ставить запросы в очередь, логировать, а также поддерживать отмену операций.
- Итератор (Iterator)- последовательно обходит элементы составных объектов, не раскрывая их внутреннего представления.
- Посредник (Mediator)- уменьшает связность множества классов между собой, благодаря перемещению этих связей в один класс-посредник.
- Снимок (Memento)- сохраняет и восстанавливает прошлые состояния объектов, не раскрывая подробностей их реализации.
- Наблюдатель (Observer)- создает механизм подписки, позволяющий одним объектам следить за событиями, происходящими в других объектах, и реагировать на них.
- Состояние (State)- изменяет поведение объектов в зависимости от своего состояния.
- Стратегия (Strategy)- определяет группу схожих алгоритмов и помещает каждый в собственный класс, после чего их можно взаимозаменять прямо во время выполнения программы.
- Шаблонный метод (Template Method)- определяет скелет алгоритма, перекладывая ответственность за некоторые его шаги на подклассы. Позволяет им переопределять шаги алгоритма, не меняя его общей структуры.
- Посетитель (Visitor)- добавляет в программу новые операции, не изменяя классы объектов, над которыми эти операции могут выполняться.
В следующих статьях мы поговорим о конкретных паттернах проектирования и будем рассматривать их реализацию.