Цель: Создание интерфейса, для создания множества взаимосвязанных или взаимозависимых объектов, без жёсткой привязке к конкретным классам.
Для чего используется: Для создания множеств взаимосвязанных объектов.
Пример использования:
- система не должна зависеть от метода создания, компоновки и представления входящих в неё объектов;
- входящие взаимосвязанные объекты должны использоваться вместе;
- система должна конфигурироваться одним из множеств объектов, из которых она состоит;
- нам необходимо предоставить множество объектов, раскрывая только их интерфейсы но не реализацию.
Цель: Создание интерфейса, который создаёт объект. При этом, выбор того, экземпляр какого класса создавать остаётся за классами, которые имплементируют данный интерфейс.
Для чего используется: Для делигирования создания экземпляров, другому классу.
Пример использования:
- заранее неизвестно, экземпляры, какого класса нужно будет создавать;
- класс спроектирован таким образом, что создаваемые им объекты имеют свойства определённого класса.
Цель: Отделить конструирование сложного объекта от его представления таким образом, чтобы в результате одного и того же конструирования мы могли получить разные представления.
Для чего используется: Для создания различных объектов из одного набора данных.
Пример использования:
- порядок создания сложного объекта не должен зависеть от того, из каких частей состоит объект и того, как эти объекты взаимосвязаны;
- процесс констрирования объекта должен предоставлять различные представления, которые мы конструируем.
Цель: Определить вид создаваемых объектов с помощью экземпляра - прототипа и создавать новые объекты, копирую этот прототип.
Для чего используется: Для создания копий заданого объекта.
Пример использования:
- классы экземпляры которых необходимо создавать определяются во время выполнения программы;
- для избежания построения иерархии классов, фабрик или пералельных иерархий классов;
- экземпляры класса могут находится в одном из немногих возможных состояний.
Цель: Гарантировать, что у класса будет только один единственный экземпляр и к нему будет представлена глобальная точка доступа.
Для чего используется: Для создания единственного экземпляра определенного класса.
Пример использования:
- необходим только один экземпляр конкретного класса, который дуступен для всех клиентов;
- единственный экземпляр должен наследоваться путем порождения подклассов, при этом, клиенты имеют возможность работать с классом-наследником без модификации своего кода.
Цель: Преобразование интерфейса одного класса в интерфейс того класса, класса, который необходим клиенту
Для чего используется: Для обеспечения совместной работы классов, интерфейсы которых не совместимы.
Пример использования:
- интерфейс класса, который мы хотим использовать не соответствует нашим потребностям;
- необходим класс, который должен взаимодействовать с классами, которые ему неизвестны или не связаны с ним;
- необходимо использовать несколько существующих подклассов, но нецелесообразно использовать методы их классов создавая их новые подклассы.
Цель: Отделить абстракцию от её реализации таким образом, чтобы мы могли изменять независимо друг от друга и то и другое.
Для чего используется: Для получения преимуществ наследования без потери гибкости.
Пример использования:
- предотвращение жесткой привязки абстракции к реализации (например, реализацию необходимо выбрать во время выполнения программы);
- в будущем мы хотим расширять с помощью подклассов и реализацию и абстракцию;
- если изменения в реализации не должны отражаться на клиентских абстракций;
- для разделения одной реализации между несколькими объектами и не показывать это клиенту.
Цель: Скомпонировать объекты в структуры по типу "дерева", позволяя клиентам единообразно трактовать отдельные и составные объекты.
Для чего используется: Для группировки мелких компонентов в более крупные, которые, в свою очередь, могут стать основой для более крупных структур.
Пример использования:
- для представления иерархии "часть-целое";
- мы хотим, чтобы клиенты одним способом трактовали как отдельные, так и составные объекты.
Цель: Динамическое добавление новых обязанностей объекту.
Для чего используется: В качестве альтернативы порождению подклассов для рассширения функциональности.
Пример использования:
- динамическое и понятное клиентам добавление обязаностей объектам;
- реализация обязанностей, которые могут быть сняты с объекта;
- рассширение класса путем порождения подклассов невозможно по каким-либо причинам.
Цель: Предоставить унифицированный интерфейс вместо нескольких интерфейсов системы.
Для чего используется: Используется для определения интерфейса высокого уровня, который упрощает использование подсистемы.
Пример использования:
- изолирование клиентов от компонентов подсистемы, упрощая работу с ней;
- необходимость ослабления связанности подсистемы с клиентами.
Цель: Поддержка множества мелких объектов
Для чего используется: Использует разделение для того, чтобы поддерживать много мелких объектов.
Пример использования:
- когда используется большое количество объектов;
- большую часть состояния объектов можно вынести наружу;
- приложение не зависит от идентичности объекта.
Цель: Для замещения другого объекта и контроля доступа к нему.
Для чего используется: Для обеспечения контроля доступа к определенному объекту.
Пример использования:
- когда есть необходимость ссылаться на объект способом отличным от обычного указателя;
- локальный представитель вместо объекта в другом адресном пространстве (удаленное замещение);
- создание "тяжёлых объектов" при необходимости (виртуальное замещение);
- контроль доступа к указаному объекту (защещённое замещение);
- замена обычного указателя: подсчет числа ссылок, установка блокировки и т.д. ("умная ссылка").
Цель: Связывание объектов - получателей в чепоччку и парадача запроса по ней.
Для чего используется: Помогает избежать привязки отправителя запроса к его получателю, что дает обработать данный запрос нескольким объектам.
Пример использования:
- ослабление привязаности (объект не должен знать, кто именно обработает его запрос);
- дополнительная гипкость при рапределении дополнительных обязанностей между объектами.
Цель: Инкапсилирование запроса в объект.
Для чего используется: Чтоба задать параматры клиентов для обработки определенных запросов, создание очереди из этих запросов или их контроля и поддержки отмены операций.
Пример использования:
- параметризация объектов выполняемым действием;
- определять запрос, ставить его в очередь или выполнять его в разное время.
Цель: Определение представления грамматики объекта.
Для чего используется: Используется для определения представления грамматики заданого языка и интерпритации его предложений.
Пример использования:
- упрощение иерархии классов с помощью интерпретирования.
Цель: Получение последовательного доступа ко всем элементам составного объекта.
Для чего используется: Для получения последовательного доступа ко всем элементам составного объекта, скрывая его внутреннее представление.
Пример использования:
- различные виды обхода составного объектаж
- упрощенный доступ к составному объекту.
Цель: Инкапсуляция способа взаимодействия множества объектов.
Для чего используется: Для определенияобъекта, который инкапсулирует способ взаимодействия можества объектов и обеспечение слабой связи между этими объектами.
Пример использования:
- связи между объектами сложны и четко определены;
- нельзя повторно использовать обект, так как он обменивается информацией с другими объектами;
- поведение, распределенное между несколькими классами должно настраиваться без создания подклассов.
Цель: Сохранить внутренее состояние объекта за его пределы.
Для чего используется: Для фиксирования внутреннего состояния объекта за его пределами не нарушая инкапсуляцию и востановление объекта в случае необходимости.
Пример использования:
- необходимо сохранить внутренее состояние объекта или его части и востановление в будущем, но прямое получение состояния раскрывает детали реализации и нарушает инкапсуляцию объекта.
Цель: Определение зависимости "один ко многим" между объектами.
Для чего используется: Определение зависимости "один ко многим" между объектами таким образом, что при изменении состояния обного объекта все зависищие от него объекты были уведомлены об этом и обновились.
Пример использования:
- когда у модели имеются два аспекта, один из которых зависит от другого. Инкапсулирование этих аспектов в разные классы позволяет использовать их независимо друг от друга;
- когда один объект должен оповещать другие и не делать предположение об этих объктах;
- ослабление связи между объектами.
Цель: Управление поведением объекта в зависимости от состояния.
Для чего используется: Позволяет управление поведением объекта в зависимости от внутриннего состояния объекта.
Пример использования:
- поведение объекта зависит от его состояния и изменяется во время выполнения;
- когда встречается большое количество условных операторов, когда выбор ветви зависит от сотояния объекта.
Цель: Взаимозаменяемость семейства классов.
Для чего используется: Определение семейства классов, инкапсуляция каждого из них и оргпнизация их взаимозаменяемости.
Пример использования:
- есть несколько родственных классов, которые отличаются поведением;
- необходимо иметь несколько вариантов поведения;
- в классе есть данные о которых не долже знать клиет;
- с помощью условных операторов в классе определено большое количество возможных поведений.
Цель: Определение основы класса и создание возможности подклассам переопределять его части.
Для чего используется: Определяет основу класса и позволяет подклассам переопрелять некоторые его части не изменяя его структуру в целом.
Пример использования:
- однократное использование различных частей класса, оставляя реализацию изменяющегося поведения на усмотрение подклассов;
- вычисление и локализация общего для всех подклассов поведения в родительском;
- управление расширениями подклассов.
Цель: Описание действий, которые выполняютс с каждым объектом в некоторой структуре.
Для чего используется: Описание операций, которые выполняются с каждым объектом из некоторой структуры. Позволяет определить новую операцию без изменения классов этих объектов.
Пример использования:
- в структуре присутствуют объекты многих классов с различными интерфейсами и нам необходимо выполнить над ними операции, которые зависят от конкретных классов;
- необходимо выполнять не связаные между собой операции над объектми, которые входят в состав структуры и мы не хотим добавлять эти операции в классы;
- классы, которые устанавливают структуру объектов, редко изменяются, но часто добавляются новые операции над этой структурой.