Файл: уфимский университет науки и технологий факультет математики и информационных технологий кафедра программирования и экономической информатики.docx
Добавлен: 10.11.2023
Просмотров: 179
Скачиваний: 8
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Минусы шаблона "Адаптер":
-
Увеличивает сложность кода за счет введения дополнительного уровня косвенности. Адаптер должен выполнять преобразования и перенаправление вызовов, что может усложнить код и ввести дополнительные затраты на производительность. -
Может быть сложно определить, когда использовать адаптер, и какой именно вид адаптера выбрать, особенно в сложных системах. -
Может привести к созданию большого количества мелких адаптеров, что усложняет поддержку кода и увеличивает его объем.
Пример
Предположим, у вас есть старая система управления заказами в интернет-магазине, которая использует базу данных с определенной схемой таблицы для хранения информации о заказах. Вам необходимо добавить новый функционал, чтобы система могла работать с другой базой данных, имеющей отличную структуру.
Вместо того, чтобы изменять существующий код и адаптировать его для работы с новой базой данных, вы можете использовать шаблон "Адаптер". Создав адаптер, который преобразует вызовы операций над таблицами и запросы в формат, понятный новой базе данных, вы сможете интегрировать ее в систему без необходимости изменения существующего кода.
Это позволяет вам использовать новую базу данных и воспользоваться ее преимуществами, такими как более эффективное хранение данных или расширенные функциональные возможности, сохраняя при этом совместимость с существующей системой управления заказами.
Таким образом, шаблон "Адаптер" позволяет интегрировать различные компоненты системы, имеющие несовместимые интерфейсы, минимизируя изменения в существующем коде и обеспечивая согласованное взаимодействие между ними.
-
Компоновщик (Composite)
Компоновщик — структурный шаблон проектирования, объединяющий объекты в древовидную структуру для представления иерархии от частного к целому. Компоновщик позволяет клиентам обращаться к отдельным объектам и к группам объектов одинаково. Паттерн определяет иерархию классов, которые одновременно могут состоять из примитивных и сложных объектов, упрощает архитектуру клиента, делает процесс добавления новых видов объекта более простым.
Простыми словами: Шаблон компоновщик позволяет клиентам работать с индивидуальными объектами в едином стиле.
Плюсы шаблона "Компоновщик":
-
Упрощает добавление новых типов компонентов в систему, поскольку все компоненты реализуют общий интерфейс. -
Облегчает работу с комплексными структурами, представляющими иерархию объектов. -
Позволяет однородно обрабатывать как отдельные объекты, так и составные объекты. -
Увеличивает гибкость системы, позволяя клиентам работать с составными и отдельными объектами через общий интерфейс.
Минусы шаблона "Компоновщик":
-
Усложняет ограничение и контроль над операциями над объектами в составной структуре. Например, если нужно ограничить доступ к определенным операциям только для отдельных объектов. -
Может быть затратным с точки зрения производительности, особенно если составная структура очень большая и глубоко вложенная.
Пример
Один из примеров использования шаблона "Компоновщик" в реальной жизни - это графический редактор, где можно создавать сложные иерархические структуры из графических элементов.
В графическом редакторе каждый графический элемент, такой как линия, прямоугольник, эллипс и т.д., может быть рассмотрен как отдельный объект. Однако пользователь также может создать более сложные графические объекты, состоящие из нескольких элементов, например, группы элементов, объединенных вместе.
Шаблон "Компоновщик" позволяет представлять иерархию графических элементов в виде древовидной структуры, где составные объекты могут содержать другие составные объекты и/или отдельные объекты.
Когда пользователь применяет операции, такие как перемещение, изменение размера или удаление к группе элементов, эти операции рекурсивно применяются ко всем элементам внутри группы. Это позволяет однородно обрабатывать как отдельные элементы, так и составные объекты.
Таким образом, шаблон "Компоновщик" в графическом редакторе позволяет удобно и гибко работать с графическими элементами и создавать сложные иерархические структуры, обеспечивая единообразие операций над ними.
-
Фасад (Facade)
Фасад — структурный шаблон проектирования, позволяющий скрыть сложность системы путём сведения всех возможных внешних вызовов к одному объекту, делегирующему их соответствующим объектам системы.
Простыми словами: Шаблон фасад предоставляет упрощенный интерфейс для сложной системы.
Плюсы паттерна "Фасад":
-
Упрощение использования подсистемы: Фасад предоставляет унифицированный интерфейс, который скрывает сложность и детали внутренней реализации подсистемы. Это позволяет клиентам легко и прозрачно взаимодействовать с системой. -
Снижение зависимостей: Фасад выступает в качестве прослойки между клиентами и подсистемой, уменьшая зависимости между ними. Клиенты взаимодействуют только с фасадом, не имея прямых связей с внутренними компонентами подсистемы. Это упрощает поддержку и развитие системы, поскольку изменения внутри подсистемы не затрагивают клиентский код. -
Улучшение расширяемости: Фасад позволяет легко добавлять новые функциональные возможности в систему без влияния на существующий клиентский код. Модификации внутри фасада не требуют изменения клиентов, поэтому система остается легко расширяемой.
Минусы паттерна "Фасад":
-
Возможное увеличение сложности фасада: Если подсистема имеет сложную структуру или большое количество компонентов, фасад может стать сложным и перегруженным. Фасад должен предоставлять упрощенный интерфейс, поэтому его проектирование и поддержка могут быть нетривиальными задачами. -
Ограниченность гибкости: Фасад может быть ограниченным в отношении возможностей, которые подсистема предлагает. Фасад скрывает детали внутренней реализации, поэтому клиенты имеют доступ только к предоставленным фасадом функциям и операциям. Если клиентам требуется более гибкое и тонкое управление или настройка подсистемы, они могут столкнуться с ограничениями фасада. -
Ограниченность контроля: Фасад скрывает детали внутренней реализации подсистемы, что означает, что клиенты теряют прямой контроль над этими деталями. Если клиентам требуется точная настройка и манипуляция с каждым компонентом подсистемы, фасад может ограничивать их возможности. -
Усложнение обслуживания: Если фасад не соответствует потребностям клиентов или требует изменений, это может повлечь за собой изменения внутри подсистемы или фасада. Если фасад не правильно абстрагирует подсистему или его интерфейс не является удобным для клиентов, его поддержка и обслуживание могут стать сложными. -
Возможное увеличение связности: Фасад может привести к увеличению связности между компонентами подсистемы, особенно если фасад не является хорошо спроектированным или превышает свою ответственность. Это может привести к трудностям при изменении или модификации компонентов подсистемы, так как изменения могут требовать изменений в фасаде и других компонентах. -
Потеря производительности: Использование фасада может привести к незначительной потере производительности из-за дополнительных слоев абстракции и вызовов. Однако, в большинстве случаев эта потеря незначительна и не является критичной.
Пример
Допустим, у вас есть система для заказа еды в ресторане. Внутри этой системы есть несколько подсистем, таких как управление меню, обработка заказов, обработка платежей и отправка уведомлений.
Чтобы упростить взаимодействие с этой сложной системой, вы можете создать фасад, который будет предоставлять упрощенный интерфейс для заказа еды. Фасад будет обрабатывать все детали внутри системы, скрывая сложность и предоставляя простой способ заказа еды для клиентов.
Например, фасад может предоставлять методы, такие как "заказать пиццу", "заказать напиток" и "оформить доставку". Внутри фасада будут выполняться необходимые действия, такие как выбор блюд из меню, обработка заказа, расчет стоимости, обработка платежа и отправка уведомлений о статусе заказа.
Таким образом, клиенты системы смогут просто вызвать методы фасада для оформления заказа еды, не требуя знания о том, как работает каждая подсистема. Фасад будет предоставлять простой и интуитивно понятный интерфейс для заказа еды, скрывая сложность и детали внутри системы.
-
Приспособленец (Flyweight)
Приспособленец — структурный шаблон проектирования, при котором объект, представляющий себя как уникальный экземпляр в разных местах программы, по факту не является таковым.
Простыми словами: Приспособленец используется для минимизации использования памяти или вычислительной стоимости путем разделения ресурсов с наибольшим количеством похожих объектов.
Плюсы использования паттерна "Приспособленец":
-
Экономия памяти: Паттерн позволяет сократить использование памяти путем разделения общих данных между множеством объектов. Вместо создания отдельного объекта для каждого экземпляра, приспособленцы используются для представления общих данных, что приводит к снижению потребления памяти. -
Улучшение производительности: Поскольку приспособленцы разделяют общие данные, это может привести к улучшению производительности системы. Множество объектов может совместно использовать одни и те же данные, что уменьшает накладные расходы на создание и управление объектами. -
Гибкость: Паттерн "Приспособленец" позволяет добавлять новые вариации объектов без значительных изменений в коде. Каждый объект может быть настроен для представления различных свойств, а общие данные могут быть легко обновлены без воздействия на существующие объекты.
Минусы использования паттерна "Приспособленец":
-
Дополнительные сложности: Реализация приспособленца может потребовать дополнительных усилий и усложнить код. Необходимо разделить объекты на внутреннее и внешнее состояние, а также управлять доступом к общей информации. -
Потеря в производительности: При использовании приспособленца возникают дополнительные затраты на хранение и обработку общей информации. В случае, когда объекты имеют большой объем информации, затраты на управление и передачу этой информации между объектами могут снизить производительность системы. -
Ограничение изменений: Если общая информация, используемая приспособленцами, изменяется, то это может повлиять на все объекты, разделяющие эту информацию. Изменение общей информации может быть сложным и потребовать внесения изменений во все приспособленцы. -
Проблемы с многопоточностью: При использовании приспособленца в многопоточной среде может возникнуть необходимость в синхронизации доступа к общей информации. Это может повлечь за собой дополнительные проблемы с производительностью и сложности кода.