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