Файл: уфимский университет науки и технологий факультет математики и информационных технологий кафедра программирования и экономической информатики.docx
Добавлен: 10.11.2023
Просмотров: 176
Скачиваний: 8
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Пример
Один из примеров применения паттерна "Приспособленец" из жизни можно найти в графическом редакторе, где используется большое количество мелких объектов, таких как точки, линии или отдельные пиксели.
В графическом редакторе каждый пиксель может быть представлен отдельным объектом с определенными свойствами, такими как координаты и цвет. Если для каждого пикселя создавать отдельный объект, то потребуется большое количество памяти для хранения и большие затраты на создание и управление этими объектами.
Вместо этого можно применить паттерн "Приспособленец". В этом случае общая информация, такая как цвет и текстура пикселя, может быть вынесена в отдельный объект-приспособленец. Каждый пиксель будет ссылаться на этот общий объект, чтобы получить свои свойства.
Таким образом, используя приспособленцев, графический редактор сможет эффективно использовать память, так как общая информация будет разделена между множеством пикселей. Это снизит объем потребляемой памяти и улучшит производительность системы.
Кроме того, изменение цвета или текстуры пикселя может быть выполнено путем изменения соответствующих свойств в объекте-приспособленце, что повлияет на все пиксели, ссылающиеся на него.
-
Заместитель (Proxy)
Заместитель — структурный шаблон проектирования, который предоставляет объект, который контролирует доступ к другому объекту, перехватывая все вызовы (выполняет функцию контейнера).
Пример из жизни: Вы когда-нибудь использовали карту доступа, чтобы пройти через дверь? Есть несколько способов открыть дверь: например, она может быть открыта при помощи карты доступа или нажатия кнопки, которая обходит защиту. Основная функциональность двери — это открытие, но заместитель, добавленный поверх этого, добавляет функциональность. Но лучше я объясню это на примере кода чуть ниже.
Простыми словами: Используя шаблон заместитель, класс отображает функциональность другого класса.
Плюсы использования паттерна "Заместитель":
-
Управление доступом: Заместитель позволяет контролировать доступ к объекту, осуществляя проверки перед выполнением операций. Например, заместитель может проверять права доступа или ограничивать количество одновременных запросов к ресурсоемким объектам. -
Ленивая инициализация: Заместитель позволяет отложить создание и инициализацию реального объекта до момента, когда он действительно понадобится. Это полезно, если создание объекта требует больших ресурсов или занимает много времени. -
Управление удаленными ресурсами: Заместитель может использоваться для управления доступом к удаленным ресурсам, например, при работе с удаленными сервисами или базами данных. Заместитель может обеспечивать кэширование данных, снижая нагрузку на сеть и улучшая производительность. -
Расширение функциональности: Заместитель может добавлять дополнительную функциональность к основному объекту, не изменяя его код. Например, заместитель может выполнять логирование операций, сбор статистики или кэширование результатов.
Минусы использования паттерна "Заместитель":
-
Дополнительная сложность: Использование прокси добавляет дополнительный уровень сложности в систему. Это может усложнить понимание и поддержку кода. -
Потеря производительности: Прокси может замедлить доступ к реальному объекту, особенно если вся логика обработки запросов происходит через прокси. Это связано с необходимостью выполнения дополнительных операций перед передачей запроса реальному объекту. -
Дополнительные расходы памяти: Использование прокси может привести к дополнительным расходам памяти, особенно если прокси хранит дополнительную информацию или кэширует результаты запросов. -
Сложности синхронизации: Если прокси используется в многопоточной среде, могут возникнуть сложности с синхронизацией доступа к реальному объекту. -
Необходимость обновления прокси: При изменении интерфейса реального объекта может потребоваться обновление кода прокси, чтобы он соответствовал новым требованиям. Это может быть дополнительной нагрузкой при поддержке системы.
Пример
Представьте, что у вас есть ограниченный доступ к некоторому ресурсу или сервису, например, к спортивному клубу. Чтобы получить доступ к клубу, вы должны быть членом клуба или иметь специальное разрешение. В этом случае, клуб может предложить вам использовать прокси-систему для доступа к своим услугам.
Прокси-система в данном случае будет выступать в качестве заместителя для вас. Вместо того, чтобы предоставить вам непосредственный доступ к клубу, вы будете обращаться к прокси-системе, которая будет проверять ваши права доступа и разрешать или запрещать доступ к клубу.
2. Порождающие шаблоны
Если говорить простыми словами, то это шаблоны, которые предназначены для создания экземпляра объекта или группы связанных объектов.
Википедия гласит:
Порождающие шаблоны — шаблоны проектирования, которые абстрагируют процесс инстанцирования. Они позволяют сделать систему независимой от способа создания, композиции и представления объектов. Шаблон, порождающий классы, использует наследование, чтобы изменять наследуемый класс, а шаблон, порождающий объекты, делегирует инстанцирование другому объекту.
-
Абстрактная фабрика (Abstract Factory)
Абстрактная фабрика — порождающий шаблон проектирования, предоставляет интерфейс для создания семейств взаимосвязанных или взаимозависимых объектов, не специфицируя их конкретных классов. Шаблон реализуется созданием абстрактного класса Factory, который представляет собой интерфейс для создания компонентов системы (например, для оконного интерфейса он может создавать окна и кнопки). Затем пишутся классы, реализующие этот интерфейс.
Простыми словами:Фабрика фабрик. Фабрика, которая группирует индивидуальные, но связанные/зависимые фабрики без указания их конкретных классов.
Плюсы:
-
изолирует конкретные классы; -
упрощает замену семейств продуктов; -
гарантирует сочетаемость продуктов.
Минусы:
-
сложно добавить поддержку нового вида продуктов.
Пример
Представьте, что у вас есть автомобильный завод, который производит различные марки автомобилей, такие как Audi, BMW и Mercedes-Benz. Каждая марка имеет свои модели, такие как Audi A4, BMW 3 Series и Mercedes-Benz C-Class. Кроме того, каждая марка имеет свои специфические детали и компоненты, такие как двигатель, подвеска и салон.
В этом случае, паттерн "Абстрактная фабрика" может быть применен следующим образом:
-
Создается абстрактный класс или интерфейс "Автомобильная фабрика", который определяет методы для создания различных компонентов автомобиля, таких как двигатель, подвеска и салон. -
Для каждой марки автомобиля создается конкретная реализация "Автомобильной фабрики", которая предоставляет конкретные реализации методов создания компонентов для данной марки. Например, у вас будет класс "AudiFactory" для создания компонентов Audi, "BMWFactory" для создания компонентов BMW и т.д. -
Клиентский код (например, менеджер производства на заводе) использует абстрактный класс "Автомобильная фабрика" для создания компонентов автомобилей, не завися от конкретной марки. Например, он может вызывать методы "createEngine()", "createSuspension()" и "createInterior()" у объекта "Автомобильная фабрика". -
В результате вызова методов у конкретной реализации "Автомобильной фабрики" (например, "AudiFactory") создаются конкретные объекты компонентов (например, двигатель Audi, подвеска Audi, салон Audi).
-
Cтроитель (Builder)
Cтроитель (Builder) -это паттерн проектирования, который используется для создания сложных объектов шаг за шагом. Он позволяет создавать различные варианты объектов, используя один и тот же процесс конструирования.
Плюсы
-
Упрощение создания сложных объектов: Паттерн Строитель позволяет разделить процесс создания сложного объекта на отдельные шаги. Это упрощает конструирование объекта и делает его более читаемым и поддерживаемым. -
Гибкость и расширяемость: Строитель позволяет создавать различные варианты объектов, в зависимости от требований. Вы можете использовать разные строители для создания объектов с различными свойствами или конфигурациями. -
Отделение процесса конструирования от самого объекта: Паттерн Строитель отделяет процесс создания объекта от самого объекта, что позволяет изменять процесс конструирования без изменения самого объекта. Это упрощает поддержку и повторное использование кода. -
Поддержка неизменяемости объектов: При использовании паттерна Строитель вы можете создавать неизменяемые объекты, то есть объекты, у которых значения свойств устанавливаются только один раз во время создания. Это помогает обеспечить безопасность и надежность объектов.
-
Поддержка пошаговой отладки: При использовании паттерна Строитель вы можете пошагово отслеживать процесс создания объекта и проверять промежуточные результаты. Это полезно при отладке и обнаружении ошибок в процессе конструирования объекта.
Минусы
-
позволяет изменять внутреннее представление продукта; -
изолирует код, реализующий конструирование и представление; -
дает более тонкий контроль над процессом конструирования.
Пример
Применения паттерна Строитель является создание объектов типа "Заказ" или "Продукт". Допустим, у нас есть объект "Заказ", который содержит различные свойства, такие как идентификатор заказа, клиент, список товаров, адрес доставки и т.д. Конструирование такого объекта напрямую с помощью конструктора может быть неудобным и запутанным, особенно если некоторые параметры являются необязательными или могут иметь различные варианты.
Паттерн Строитель позволяет создать строительный класс (Builder), который шаг за шагом конструирует объект заказа. Этот класс содержит методы для установки каждого параметра заказа, а также метод для получения окончательного результата - готового объекта "Заказ". Клиентский код может использовать строительный класс, чтобы настраивать заказ пошагово, устанавливая только необходимые параметры и игнорируя необязательные.
-
Фабричный метод (Factory Method)
Фабричный метод — порождающий шаблон проектирования, предоставляющий подклассам интерфейс для создания экземпляров некоторого класса. В момент создания наследники могут определить, какой класс инстанциировать. Иными словами, Фабрика делегирует создание объектов наследникам родительского класса. Это позволяет использовать в коде программы не специфические классы, а манипулировать абстрактными объектами на более высоком уровне. Также известен под названием виртуальный конструктор.
|
-
позволяет сделать код создания объектов более универсальным, не привязываясь к конкретным классам (ConcreteProduct), а оперируя лишь общим интерфейсом (Product); -
позволяет установить связь между параллельными иерархиями классов.
Минусы
-
необходимость создавать наследника Creator для каждого нового типа продукта (ConcreteProduct).
Пример
Фабричный метод является создание объектов различных типов файлов. Предположим, у нас есть абстрактный класс "Файл", от которого наследуются конкретные подклассы "Текстовый файл", "Изображение", "Аудиофайл" и т.д. Каждый подкласс имеет свою специфическую логику создания файла.