Шаблоны проектирования
В разработке программного обеспечения, шаблон проектирования или паттерн (design pattern) — повторимая архитектурная конструкция, представляющая собой решение проблемы проектирования в рамках некоторого часто возникающего контекста.
История
В 1970-е годы архитектор Кристофер Александр составил набор шаблонов проектирования. В области архитектуры эта идея не получила такого развития, как позже в области программной разработки.
В 1987 году Кент Бэк (Kent Beck) и Вард Каннингем (Ward Cunningham) взяли идеи Александра и разработали шаблоны применительно к разработке программного обеспечения для разработки графических оболочек на языке Smalltalk.
В 1988 году Эрих Гамма (Erich Gamma) начал писать докторскую диссертацию при цюрихском университете об общей переносимости этой методики на разработку программ.
В 1989—1991 годах Джеймс Коплин (James Coplien) трудился над разработкой идиом для программирования на C++ и опубликовал в 1991 году книгу Advanced C++ Idioms.
В этом же году Эрих Гамма заканчивает свою докторскую диссертацию и переезжает в США, где в сотрудничестве с Ричардом Хелмом (Richard Helm), Ральфом Джонсоном (Ralph Johnson) и Джоном Влиссидсом (John Vlissides) публикует книгу Design Patterns — Elements of Reusable Object-Oriented Software. В этой книге описаны 23 шаблона проектирования. Также команда авторов этой книги известна общественности под названием «Банда четырёх» (Gang of Four, часто сокращается до GoF). Именно эта книга стала причиной роста популярности шаблонов проектирования.
Польза
Главная польза каждого отдельного шаблона состоит в том, что он описывает решение целого класса абстрактных проблем. Также тот факт, что каждый шаблон имеет свое имя, облегчает дискуссию об абстрактных структурах данных (ADT) между разработчиками, так как они могут ссылаться на известные шаблоны. Таким образом, за счёт шаблонов производится унификация терминологии, названий модулей и элементов проекта.
Правильно сформулированный шаблон проектирования позволяет, отыскав удачное решение, пользоваться им снова и снова.
Основные типы шаблонов проектирования
Название |
Оригинальное название |
Описание |
Основные шаблоны (Fundamental) |
||
Шаблон делегирования |
Delegation pattern |
Объект внешне выражает некоторое поведение, но в реальности передаёт ответственность за выполнение этого поведения связанному объекту. |
Шаблон функционального дизайна |
Functional design |
Гарантирует, что каждый модуль компьютерной программы имеет только одну обязанность и исполняет её с минимумом побочных эффектов на другие части программы. |
Неизменяемый интерфейс |
Immutable interface |
Создание неизменяемого объекта. |
Интерфейс |
Interface |
Общий метод для структурирования компьютерных программ для того, чтобы их было проще понять. |
Интерфейс-маркер |
Marker interface |
В качестве атрибута (как пометки объектной сущности) применяется наличие или отсутствие реализации интерфейса-маркера. В современных языках программирования вместо этого могут применяться атрибуты или аннотации. |
Контейнер свойств |
Property Container |
Позволяет добавлять дополнительные свойства для класса в контейнер (внутри класса), вместо расширения класса новыми свойствами. |
Event Channel |
Event Channel |
Расширяет шаблон Publish/Subscribe, создавая централизованный канал для событий. Использует объект-представитель для подписки и объект-представитель для публикации события в канале. Представитель существует отдельно от реального издателя или подписчика. Подписчик может получать опубликованные события от более чем одного объекта, даже если он зарегистрирован только на одном канале. |
Порождающие шаблоны (Creational) — шаблоны проектирования, которые абстрагируют процесс инстанцирования. Они позволяют сделать систему независимой от способа создания, композиции и представления объектов. Шаблон, порождающий классы, использует наследование, чтобы изменять инстанцируемый класс, а шаблон, порождающий объекты, делегирует инстанцирование другому объекту. |
||
Абстрактная фабрика |
Abstract factory |
Класс, который представляет собой интерфейс для создания компонентов системы. |
Строитель |
Builder |
Класс, который представляет собой интерфейс для создания сложного объекта. |
Фабричный метод |
Factory method |
Определяет интерфейс для создания объекта, но оставляет подклассам решение о том, какой класс инстанцировать. |
Отложенная инициализация |
Lazy initialization |
Объект, инициализируемый во время первого обращения к нему. |
Пул одиночек |
Multiton |
Гарантирует, что класс имеет поименованные экземпляры объекта и обеспечивает глобальную точку доступа к ним. |
Объектный пул |
Object pool |
Класс, который представляет собой интерфейс для работы с набором инициализированных и готовых к использованию объектов. |
Прототип |
Prototype |
Определяет интерфейс создания объекта через клонирование другого объекта вместо создания через конструктор. |
Получение ресурса есть инициализация |
Resource acquisition is initialization (RAII) |
Получение некоторого ресурса совмещается с инициализацией, а освобождение — с уничтожением объекта. |
Одиночка |
Singleton |
Класс, который может иметь только один экземпляр. |
Структурные шаблоны (Structural) определяют различные сложные структуры, которые изменяют интерфейс уже существующих объектов или его реализацию, позволяя облегчить разработку и оптимизировать программу. |
||
Адаптер |
Adapter / Wrapper |
Объект, обеспечивающий взаимодействие двух других объектов, один из которых использует, а другой предоставляет несовместимый с первым интерфейс. |
Мост |
Bridge |
Структура, позволяющая изменять интерфейс обращения и интерфейс реализации класса независимо. |
Компоновщик |
Composite |
Объект, который объединяет в себе объекты, подобные ему самому. |
Декоратор или Wrapper/Обёртка |
Decorator |
Класс, расширяющий функциональность другого класса без использования наследования. |
Фасад |
Facade |
Объект, который абстрагирует работу с несколькими классами, объединяя их в единое целое. |
Единая точка входа |
Front Controller |
Обеспечивает унифицированный интерфейс для интерфейсов в подсистеме. Front Controller определяет высокоуровневый интерфейс, упрощающий использование подсистемы. |
Приспособленец |
Flyweight |
Это объект, представляющий себя как уникальный экземпляр в разных местах программы, но по факту не являющийся таковым. |
Заместитель |
Proxy |
Объект, который является посредником между двумя другими объектами, и который реализует/ограничивает доступ к объекту, к которому обращаются через него. |
Поведенческие шаблоны (Behavioral) определяют взаимодействие между объектами, увеличивая таким образом его гибкость. |
||
Цепочка ответственности |
Chain of responsibility |
Предназначен для организации в системе уровней ответственности. |
Команда, Action, Transaction |
Command |
Представляет действие. Объект команды заключает в себе само действие и его параметры. |
Интерпретатор |
Interpreter |
Решает часто встречающуюся, но подверженную изменениям, задачу. |
Итератор, Cursor |
Iterator |
Представляет собой объект, позволяющий получить последовательный доступ к элементам объекта-агрегата без использования описаний каждого из объектов, входящих в состав агрегации. |
Посредник |
Mediator |
Обеспечивает взаимодействие множества объектов, формируя при этом слабую связанность и избавляя объекты от необходимости явно ссылаться друг на друга. |
Хранитель, Token |
Memento |
Позволяет не нарушая инкапсуляцию зафиксировать и сохранить внутреннее состояния объекта так, чтобы позднее восстановить его в этом состоянии. |
Null Object |
Null object |
Предотвращает нулевые указатели, предоставляя объект «по умолчанию». |
Наблюдатель, Dependents, Publish-Subscribe,Listener |
Observer илиPublish/subscribe |
Определяет зависимость типа «один ко многим» между объектами таким образом, что при изменении состояния одного объекта все зависящие от него оповещаются об этом событии. |
Слуга |
Servant |
Используется для обеспечения общей функциональности группе классов. |
Спецификация |
Specification |
Служит для связывания бизнес-логики. |
Состояние, Objects for States |
State |
Используется в тех случаях, когда во время выполнения программы объект должен менять свое поведение в зависимости от своего состояния. |
Стратегия |
Strategy |
Предназначен для определения семейства алгоритмов, инкапсуляции каждого из них и обеспечения их взаимозаменяемости. |
Шаблонный метод |
Template method |
Определяет основу алгоритма и позволяет наследникам переопределять некоторые шаги алгоритма, не изменяя его структуру в целом. |
Посетитель |
Visitor |
Описывает операцию, которая выполняется над объектами других классов. При изменении класса Visitor нет необходимости изменять обслуживаемые классы. |
Single-serving visitor |
Single-serving visitor |
Оптимизирует реализацию шаблона посетитель, который инициализируется, единожды используется, и затем удаляется. |
Hierarchical visitor |
Hierarchical visitor |
Предоставляет способ обхода всех вершин иерархической структуры данных (напр. древовидной). |