Материал: Паттерны

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Оглавление

Паттерн Abstract Factory (абстрактная фабрика) 5

Назначение паттерна Abstract Factory 5

Результаты применения паттерна Abstract Factory 5

Достоинства паттерна Abstract Factory 5

Недостатки паттерна Abstract Factory 5

Паттерн Builder (строитель) 7

Назначение паттерна Builder 7

Описание паттерна Builder 7

Результаты применения паттерна Builder 7

Достоинства паттерна Builder 7

Недостатки паттерна Builder 7

Паттерн Factory Method (фабричный метод) 9

Назначение паттерна Factory Method 9

Описание паттерна Factory Method 9

Результаты применения паттерна Factory Method 9

Достоинства паттерна Factory Method 9

Недостатки паттерна Factory Method 9

Паттерн Object Pool (пул объектов) 11

Назначение паттерна Object Pool 11

Решаемая проблема 11

Обсуждение паттерна Object Pool 11

Структура паттерна Object Pool 11

UML-диаграмма классов паттерна Object Pool 11

Пример паттерна Object Pool 11

Особенности паттерна Object Pool 11

Паттерн Prototype (прототип) 13

Назначение паттерна Prototype 13

Описание паттерна Prototype 13

Результаты применения паттерна Prototype 13

Достоинства паттерна Prototype 13

Недостатки паттерна Prototype 13

Паттерн Singleton (одиночка,синглет) 14

Назначение паттерна Singleton 14

Описание паттерна Singleton 14

UML-диаграмма классов паттерна Singleton 14

Результаты применения паттерна Singleton 14

Достоинства паттерна Singleton 14

Недостатки паттерна Singleton 14

Паттерн Adapter (адаптер, wrapper, обертка) 15

Назначение паттерна Adapter 15

Описание паттерна Adapter 15

UML-диаграмма классов паттерна Adapter 15

Результаты применения паттерна Adapter 15

Достоинства паттерна Adapter 15

Недостатки паттерна Adapter 16

Паттерн Bridge (мост, идиома "Handle/Body") 17

Назначение паттерна Bridge 17

Описание паттерна Bridge 17

Результаты применения паттерна Bridge 17

Достоинства паттерна Bridge 17

Паттерн Composite (компоновщик) 18

Назначение паттерна Composite 18

Описание паттерна Composite 18

Результаты применения паттерна Composite 18

Достоинства паттерна Composite 18

Недостатки паттерна Composite 18

Паттерн Decorator (декоратор, wrapper, обертка) 19

Назначение паттерна Decorator 19

Решаемая проблема 19

Пример паттерна Decorator 19

Паттерн Facade (фасад) 20

Назначение паттерна Facade 20

Решаемая проблема 20

Обсуждение паттерна Facade 20

Структура паттерна Facade 20

Пример паттерна Facade 20

Паттерн Flyweight (приспособленец) 21

Назначение паттерна Flyweight 21

Решаемая проблема 21

Обсуждение паттерна Flyweight 21

Паттерн Proxy (заместитель, surrogate, суррогат) 22

Назначение паттерна Proxy 22

Решаемая проблема 22

Обсуждение паттерна Proxy 22

Структура паттерна Proxy 22

UML-диаграмма классов паттерна Proxy 23

Пример паттерна Proxy 23

Паттерн Chain of Responsibility (цепочка обязанностей) 23

Назначение паттерна Chain of Responsibility 23

Решаемая проблема 23

Обсуждение паттерна Chain of Responsibility 23

Пример паттерна Chain of Responsibility 23

Паттерн Command (команда) 25

Назначение паттерна Command 25

Описание паттерна Command 25

Результаты применения паттерна Command 25

Достоинства паттерна Command 25

Паттерн Interpreter (интерпетатор) 26

Назначение паттерна Interpreter 26

Решаемая проблема 26

Обсуждение паттерна Interpreter 26

Структура паттерна Interpreter 26

Пример паттерна Interpreter 26

Паттерн Iterator (итератор, cursor, курсор) 27

Назначение паттерна Iterator 27

Решаемая проблема 27

Обсуждение паттерна Iterator 27

Пример паттерна Iterator 27

Паттерн Mediator (посредник) 28

Назначение паттерна Mediator 28

Решаемая проблема 28

Пример паттерна Mediator 28

Паттерн Memento (хранитель) 29

Назначение паттерна Memento 29

Решаемая проблема 29

Обсуждение паттерна Memento 29

Пример паттерна Memento 29

Паттерн Observer (наблюдатель, издатель-подписчик) 31

Назначение паттерна Observer 31

Решаемая проблема 31

Пример паттерна Observer 31

Паттерн State (состояние) 32

Назначение паттерна State 32

Решаемая проблема 32

Пример паттерна State 32

Паттерн Strategy (стратегия) 33

Назначение паттерна Strategy 33

Результаты применения паттерна Strategy 33

Достоинства паттерна Strategy 33

Недостатки паттерна Strategy 33

Паттерн Template Method (шаблонный метод) 34

Назначение паттерна Template Method 34

Решаемая проблема 34

Пример паттерна Template Method 34

Паттерн Visitor (посетитель) 35

Назначение паттерна Visitor 35

Решаемая проблема 35

Паттерн Abstract Factory (абстрактная фабрика)

Назначение паттерна Abstract Factory

Используйте паттерн Abstract Factory (абстрактная фабрика) если:

  • Система должна оставаться независимой как от процесса создания новых объектов, так и от типов порождаемых объектов. Непосредственное использование выражения new в коде приложения нежелательно (подробнее об этом в разделе Порождающие паттерны).

  • Необходимо создавать группы или семейства взаимосвязанных объектов, исключая возможность одновременного использования объектов из разных семейств в одном контексте.

Приведем примеры групп взаимосвязанных объектов.

Пусть некоторое приложение с поддержкой графического интерфейса пользователя рассчитано на использование на различных платформах, при этом внешний вид этого интерфейса должен соответствовать принятому стилю для той или иной платформы. Например, если это приложение установлено на Windows-платформу, то его кнопки, меню, полосы прокрутки должны отображаться в стиле, принятом для Windows. Группой взаимосвязанных объектов в этом случае будут элементы графического интерфейса пользователя для конкретной платформы.

Результаты применения паттерна Abstract Factory Достоинства паттерна Abstract Factory

  • Скрывает сам процесс порождения объектов, а также делает систему независимой от типов создаваемых объектов, специфичных для различных семейств или групп (пользователи оперируют этими объектами через соответствующие абстрактные интерфейсы).

  • Позволяет быстро настраивать систему на нужное семейство создаваемых объектов. В случае многоплатформенного графического приложения для перехода на новую платформу, то есть для замены графических элементов (кнопок, меню, полос прокрутки) одного стиля другим достаточно создать нужный подкласс абстрактной фабрики. При этом условие невозможности одновременного использования элементов разных стилей для некоторой платформы будет выполнено автоматически.

Недостатки паттерна Abstract Factory

  • Трудно добавлять новые типы создаваемых продуктов или заменять существующие, так как интерфейс базового класса абстрактной фабрики фиксирован. Например, если для нашей стратегической игры нужно будет ввести новый вид военной единицы - осадные орудия, то надо будет добавить новый фабричный метод, объявив его интерфейс в полиморфном базовом классе AbstractFactory и реализовав во всех подклассах.

Паттерн Builder (строитель) Назначение паттерна Builder

Паттерн Builder может помочь в решении следующих задач:

  • В системе могут существовать сложные объекты, создание которых за одну операцию затруднительно или невозможно. Требуется поэтапное построение объектов с контролем результатов выполнения каждого этапа.

  • Данные должны иметь несколько представлений. Приведем классический пример. Пусть есть некоторый исходный документ в формате RTF (Rich Text Format), в общем случае содержащий текст, графические изображения и служебную информацию о форматировании (размер и тип шрифтов, отступы и др.). Если этот документ в формате RTF преобразовать в другие форматы (например, Microsoft Word или простой ASCII-текст), то полученные документы и будут представлениями исходных данных.

Описание паттерна Builder

Паттерн Builder отделяет алгоритм поэтапного конструирования сложного продукта (объекта) от его внешнего представления так, что с помощью одного и того же алгоритма можно получать разные представления этого продукта.

Поэтапное создание продукта означает его построение по частям. После того как построена последняя часть, продукт можно использовать.

Для этого паттерн Builder определяет алгоритм поэтапного создания продукта в специальном классе Director (распорядитель), а ответственность за координацию процесса сборки отдельных частей продукта возлагает на иерархию классов Builder. В этой иерархии базовый класс Builder объявляет интерфейсы для построения отдельных частей продукта, а соответствующие подклассы ConcreteBuilder их реализуют подходящим образом, например, создают или получают нужные ресурсы, сохраняют промежуточные результаты, контролируют результаты выполнения операций.

Результаты применения паттерна Builder

Достоинства паттерна Builder

  • Возможность контролировать процесс создания сложного продукта.

  • Возможность получения разных представлений некоторых данных.

Недостатки паттерна Builder

  • ConcreteBuilder и создаваемый им продукт жестко связаны между собой, поэтому при внесеннии изменений в класс продукта скорее всего придется соотвествующим образом изменять и класс ConcreteBuilder.

Паттерн Factory Method (фабричный метод)

Назначение паттерна Factory Method

В системе часто требуется создавать объекты самых разных типов. Паттерн Factory Method (фабричный метод) может быть полезным в решении следующих задач:

  • Система должна оставаться расширяемой путем добавления объектов новых типов. Непосредственное использование выражения new является нежелательным, так как в этом случае код создания объектов с указанием конкретных типов может получиться разбросанным по всему приложению. Тогда такие операции как добавление в систему объектов новых типов или замена объектов одного типа на другой будут затруднительными (подробнее в разделе Порождающие паттерны). Паттерн Factory Method позволяет системе оставаться независимой как от самого процесса порождения объектов, так и от их типов.

  • Заранее известно, когда нужно создавать объект, но неизвестен его тип.

Описание паттерна Factory Method

Для того, чтобы система оставалась независимой от различных типов объектов, паттерн Factory Method использует механизм полиморфизма - классы всех конечных типов наследуют от одного абстрактного базового класса, предназначенного для полиморфного использования. В этом базовом классе определяется единый интерфейс, через который пользователь будет оперировать объектами конечных типов.

Для обеспечения относительно простого добавления в систему новых типов паттерн Factory Method локализует создание объектов конкретных типов в специальном классе-фабрике. Методы этого класса, посредством которых создаются объекты конкретных классов, называются фабричными. Существуют две разновидности паттерна Factory Method:

Обобщенный конструктор, когда в том же самом полиморфном базовом классе, от которого наследуют производные классы всех создаваемых в системе типов, определяется статический фабричный метод. В качестве параметра в этот метод должен передаваться идентификатор типа создаваемого объекта.

Результаты применения паттерна Factory Method

Достоинства паттерна Factory Method

  • Создает объекты разных типов, позволяя системе оставаться независимой как от самого процесса создания, так и от типов создаваемых объектов.

Недостатки паттерна Factory Method

  • В случае классического варианта паттерна даже для порождения единственного объекта необходимо создавать соответствующую фабрику

Паттерн Object Pool (пул объектов)

Назначение паттерна Object Pool

Применение паттерна Object Pool может значительно повысить производительность системы; его использование наиболее эффективно в ситуациях, когда создание экземпляров некоторого класса требует больших затрат, объекты в системе создаются часто, но число создаваемых объектов в единицу времени ограничено.

Решаемая проблема

Пулы объектов (известны также как пулы ресурсов) используются для управления кэшированием объектов. Клиент, имеющий доступ к пулу объектов может избежать создания новых объектов, просто запрашивая в пуле уже созданный экземпляр. Пул объектов может быть растущим, когда при отсутствии свободных создаются новые объекты или c ограничением количества создаваемых объектов.

Желательно, чтобы все многократно используемые объекты, свободные в некоторый момент времени, хранились в одном и том же пуле объектов. Тогда ими можно управлять на основе единой политики. Для этого класс Object Pool проектируется с помощью паттерна Singleton.

Обсуждение паттерна Object Pool

Процессы запрашивают объекты из пула объектов. Когда эти объекты больше не нужны, они возвращаются в пул для дальнейшего повторного использования.

Если при очередном запросе все объекты пула заняты, то процесс будет ожидать освобождения объекта. Для исключения подобной ситуации пул объектов должен уметь создавать новые объекты по мере необходимости. При этом он также должен реализовывать механизм периодической очистки неиспользуемых объектов.

Структура паттерна Object Pool

Основная идея паттерна Object Pool состоит в том, чтобы избежать создания новых экземпляров класса в случае возможности их повторного использования.

UML-диаграмма классов паттерна Object Pool

  • Reusable - экземпляры классов в этой роли взаимодействуют с другими объектами в течение ограниченного времени, а затем они больше не нужны для этого взаимодействия.

  • Client - экземпляры классов в этой роли используют объекты Reusable.

  • ReusablePool - экземпляры классов в этой роли управляют объектами Reusable для использования объектами Client.

Пример паттерна Object Pool

Вам нравится боулинг? Если да, то вы, наверное, знаете, что должны сменить вашу обувь при посещении боулинг-клуба. Полка с обувью - прекрасный пример пула объектов. Когда вы хотите играть, вы берете с нее пару (acquireReusable). А после игры, вы возвращаете обувь обратно на полку (releaseReusable).

Особенности паттерна Object Pool

  • Паттерн Factory Method может использоваться для инкапсуляции логики создания объектов. Однако он не управляет ими после их создания. Пул объектов отслеживает объекты, которые он создает.

  • Пулы объектов, как правило, реализуются в виде одиночек.

Паттерн Prototype (прототип)

Назначение паттерна Prototype

Паттерн Prototype (прототип) можно использовать в следующих случаях:

  • Система должна оставаться независимой как от процесса создания новых объектов, так и от типов порождаемых объектов. Непосредственное использование выражения new в коде приложения считается нежелательным (подробнее об этом в разделе Порождающие паттерны).

  • Необходимо создавать объекты, точные классы которых становятся известными уже на стадии выполнения программы.

Описание паттерна Prototype

Для создания новых объектов паттерн Prototype использует прототипы. Прототип - это уже существующий в системе объект, который поддерживает операцию клонирования, то есть умеет создавать копию самого себя. Таким образом, для создания объекта некоторого класса достаточно выполнить операцию clone() соответствующего прототипа.

Результаты применения паттерна Prototype

Достоинства паттерна Prototype

  • Для создания новых объектов клиенту необязательно знать их конкретные классы.

  • Возможность гибкого управления процессом создания новых объектов за счет возможности динамических добавления и удаления прототипов в реестр.

Недостатки паттерна Prototype

  • Каждый тип создаваемого продукта должен реализовывать операцию клонирования clone(). В случае, если требуется глубокое копирование объекта (объект содержит ссылки или указатели на другие объекты), это может быть непростой задачей.

Паттерн Singleton (одиночка,синглет)

Назначение паттерна Singleton

Часто в системе могут существовать сущности только в единственном экземпляре, например, система ведения системного журнала сообщений или драйвер дисплея. В таких случаях необходимо уметь создавать единственный экземпляр некоторого типа, предоставлять к нему доступ извне и запрещать создание нескольких экземпляров того же типа.

Паттерн Singleton предоставляет такие возможности.

Описание паттерна Singleton

Архитектура паттерна Singleton основана на идее использования глобальной переменной, имеющей следующие важные свойства:

  1. Такая переменная доступна всегда. Время жизни глобальной переменной - от запуска программы до ее завершения.

  2. Предоставляет глобальный доступ, то есть, такая переменная может быть доступна из любой части программы.

Однако, использовать глобальную переменную некоторого типа непосредственно невозможно, так как существует проблема обеспечения единственности экземпляра, а именно, возможно создание нескольких переменных того же самого типа (например, стековых).

Для решения этой проблемы паттерн Singleton возлагает контроль над созданием единственного объекта на сам класс. Доступ к этому объекту осуществляется через статическую функцию-член класса, которая возвращает указатель или ссылку на него. Этот объект будет создан только при первом обращении к методу, а все последующие вызовы просто возвращают его адрес. Для обеспечения уникальности объекта, конструкторы и оператор присваивания объявляются закрытыми.

UML-диаграмма классов паттерна Singleton

Паттерн Singleton часто называют усовершенствованной глобальной переменной.

Результаты применения паттерна Singleton

Источник: https://studfile.net/preview/16584796/