# Table of Contents - [Введение в паттерны](#-) - [Строитель | Введение в паттерны](#-) - [Прототип | Введение в паттерны](#-) - [Одиночка | Введение в паттерны](#-) - [Пул объектов | Введение в паттерны](#-) - [Структурные паттерны | Введение в паттерны](#-) - [Адаптер | Введение в паттерны](#-) - [Декоратор | Введение в паттерны](#-) - [Реализации на Kotlin | Введение в паттерны](#-kotlin-) - [Реализации на Kotlin | Введение в паттерны](#-kotlin-) - [Реализации на Kotlin | Введение в паттерны](#-kotlin-) - [Реализации на Kotlin | Введение в паттерны](#-kotlin-) - [Реализации на Kotlin | Введение в паттерны](#-kotlin-) - [Реализации на С++ | Введение в паттерны](#-) - [Мост | Введение в паттерны](#-) - [Реализации на С++ | Введение в паттерны](#-) - [Реализации на С++ | Введение в паттерны](#-) - [Возможные реализации для решения конкретных задач на С++ | Введение в паттерны](#-) - [Возможные реализации для решения конкретных задач на С++ | Введение в паттерны](#-) - [Реализации на Java | Введение в паттерны](#-java-) - [Оглавление | Введение в паттерны](#-) - [Реализации на C++ | Введение в паттерны](#-c-) - [Реализации на С++ | Введение в паттерны](#-) - [Реализации на С++ | Введение в паттерны](#-) - [Реализации на Kotlin | Введение в паттерны](#-kotlin-) - [Возможные реализации для решения конкретных задач | Введение в паттерны](#-) - [Реализации на С++ | Введение в паттерны](#-) - [Реализации на С++ | Введение в паттерны](#-) - [Возможные реализации для решения конкретных задач на С++ | Введение в паттерны](#-) - [Реализации на С++ | Введение в паттерны](#-) - [Заместитель | Введение в паттерны](#-) - [Порождающие паттерны | Введение в паттерны](#-) - [Фабричный метод | Введение в паттерны](#-) - [Реализации на Kotlin | Введение в паттерны](#-kotlin-) - [Реализации на С++ | Введение в паттерны](#-) - [Абстрактная фабрика | Введение в паттерны](#-) - [Возможные реализации для решения конкретных задач на С++ | Введение в паттерны](#-) - [Компоновщик | Введение в паттерны](#-) - [Реализации на С++ | Введение в паттерны](#-) - [Реализации на Kotlin | Введение в паттерны](#-kotlin-) - [Приспособленец | Введение в паттерны](#-) - [Фасад | Введение в паттерны](#-) - [Реализации на С++ | Введение в паттерны](#-) - [Реализации на С++ | Введение в паттерны](#-) - [Поведенческие паттерны | Введение в паттерны](#-) - [Реализации на Kotlin | Введение в паттерны](#-kotlin-) - [Реализации на С++ | Введение в паттерны](#-) - [Реализации на С++ | Введение в паттерны](#-) - [Команда | Введение в паттерны](#-) - [Стратегия | Введение в паттерны](#-) - [Цепочка обязанностей | Введение в паттерны](#-) - [Реализации на Kotlin | Введение в паттерны](#-kotlin-) - [Реализации на Kotlin | Введение в паттерны](#-kotlin-) - [Реализации на С++ | Введение в паттерны](#-) - [Реализации на С++ | Введение в паттерны](#-) - [Введение в идиомы | Введение в паттерны](#-) - [Подписчик-издатель | Введение в паттерны](#-) - [Реализации на С++ | Введение в паттерны](#-) - [Shrink to fit | Введение в паттерны](#shrink-to-fit-) - [CRTP | Введение в паттерны](#crtp-) - [Контейнеры с type erasure | Введение в паттерны](#-type-erasure-) - [RAII | Введение в паттерны](#raii-) - [Реализации на Kotlin | Введение в паттерны](#-kotlin-) - [Статический полиморфизм | Введение в паттерны](#-) - [Опекун | Введение в паттерны](#-) - [Decltype (auto) | Введение в паттерны](#decltype-auto-) - [Type erasure | Введение в паттерны](#type-erasure-) - [Addressof | Введение в паттерны](#addressof-) - [Proxy | Введение в паттерны](#proxy-) - [Реализации на С++ | Введение в паттерны](#-) - [Реализации на С++ | Введение в паттерны](#-) - [Erase remove | Введение в паттерны](#erase-remove-) - [Scope guard | Введение в паттерны](#scope-guard-) - [Оглавление | Введение в паттерны](#-) - [Реализации на Kotlin | Введение в паттерны](#-kotlin-) - [Реализации на Kotlin | Введение в паттерны](#-kotlin-) - [Реализации на С++ | Введение в паттерны](#-) - [Реализации на С++ | Введение в паттерны](#-) - [Посредник | Введение в паттерны](#-) - [Copy and swap | Введение в паттерны](#copy-and-swap-) - [Посетитель | Введение в паттерны](#-) - [Итератор | Введение в паттерны](#-) - [Шаблонный метод | Введение в паттерны](#-) - [Реализации на С++ | Введение в паттерны](#-) - [Свойство | Введение в паттерны](#-) - [Возможные реализации для решения конкретных задач | Введение в паттерны](#-) - [Safe bool | Введение в паттерны](#safe-bool-) - [Возможные реализации для решения конкретных задач | Введение в паттерны](#-) --- # Введение в паттерны circle-info **Главная идея:** Разделяй и властвуй. [hashtag](https://y2kot.gitbook.io/untitled#chto-takoe-patterny-proektirovaniya) Что такое паттерны проектирования? ------------------------------------------------------------------------------------------------------------------------ **Паттерны проектирования** - это набор общепринятых подходов, предназначенных для решения проблем, возникающих в процессе проектирования и разработки программного обеспечения. Паттерны описывают определенные способы организации классов и связей между ними. Используются для достижения таких целей, как улучшение декомпозиции задачи и легкой модификации кода. Паттерны обеспечивают возможность повторного использования кода. [hashtag](https://y2kot.gitbook.io/untitled#osnovnaya-ideya) Основная идея ------------------------------------------------------------------------------- Основная идея паттернов проектирования заключается в предоставлении типовых решений для проблем, с которыми сталкиваются разработчики. Вместо того, чтобы каждый раз "изобретать велосипед" и декомпозировать задачу с нуля, можно использовать проверенные проектные подходы. [hashtag](https://y2kot.gitbook.io/untitled#preimushestva) Преимущества ---------------------------------------------------------------------------- * Готовое решение * Упрощение модификации кода * Облегчение взаимодействия между программистами * Повышение скорости разработки * Увеличение надежности кода * Повышение читаемости кода [hashtag](https://y2kot.gitbook.io/untitled#nedostatki) Недостатки ----------------------------------------------------------------------- * Увеличение объема кода * Увеличение времени выполнения * Высокие требования к памяти * Увеличение времени компиляции * Может привести к уменьшению скорости разработки [NextОглавлениеchevron-right](https://y2kot.gitbook.io/untitled/patterns/oglavlenie) Last updated 1 year ago * [Что такое паттерны проектирования?](https://y2kot.gitbook.io/untitled#chto-takoe-patterny-proektirovaniya) * [Основная идея](https://y2kot.gitbook.io/untitled#osnovnaya-ideya) * [Преимущества](https://y2kot.gitbook.io/untitled#preimushestva) * [Недостатки](https://y2kot.gitbook.io/untitled#nedostatki) sun-brightdesktopmoon sun-brightdesktopmoon --- # Строитель | Введение в паттерны [hashtag](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/builder#problema) Проблема --------------------------------------------------------------------------------------------------------- Требуется создавать в одном месте сложный объект, состоящий из множества подобъектов. circle-info Примером сложного объекта может служить объект почтового сообщения Email. У этого объекта может быть множество параметров, таких как отправитель, получатель, тема, текст, вложения. Используя паттерн Строитель, можно поэтапно создать объект почтового сообщения с различными параметрами. [hashtag](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/builder#naznachenie) Назначение -------------------------------------------------------------------------------------------------------------- Строитель (Builder) — это порождающий паттерн проектирования, который позволяет создавать сложные объекты, разбив процесс конструирования сложного объекта на отдельные шаги. [hashtag](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/builder#reshaemye-zadachi) Решаемые задачи ------------------------------------------------------------------------------------------------------------------------- * Поэтапное создание сложного объекта Появляется возможность создавать сложные объекты пошагово. Каждый шаг строителя определяет значения и настройки для соответствующей части объекта. * Отделение процесса контроля за созданием объекта от самого процесса создания объекта. Одна сущность (строитель) определяет шаги конструирования объекта, в то время как другая сущность (директор) управляет последовательностью этих шагов, обеспечивая создание объекта с нужной конфигурацией. [hashtag](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/builder#uml-diagramma) UML диаграмма ------------------------------------------------------------------------------------------------------------------- ![](https://y2kot.gitbook.io/untitled/~gitbook/image?url=https%3A%2F%2F4012669134-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FZZOFvJdMaAKUXTNhFX2E%252Fuploads%252Fgit-blob-3f231f942280d58fab0950143810b25fa1179b31%252Fbuilder_white.png%3Falt%3Dmedia&width=768&dpr=3&quality=100&sign=4a69f797&sv=2) UML диаграмма паттерна "Строитель" [hashtag](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/builder#preimushestva) Преимущества ------------------------------------------------------------------------------------------------------------------ 1. Упрощение процесса создания сложных объектов. 2. Разделение процесса создания объекта и контроля за созданием объекта. [hashtag](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/builder#nedostatki) Недостатки ------------------------------------------------------------------------------------------------------------- 1. Усложнение кода из-за введения дополнительных иерархий классов. 2. Избыточность кода для создания простых объектов [hashtag](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/builder#svyaz-s-drugimi-patternami) Связь с другими паттернами --------------------------------------------------------------------------------------------------------------------------------------------- 1. Паттерн Строитель может использоваться вместе с [Фабричным методом](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/factory-method#naznachenie) для создания сложных объектов. "Фабричный метод" определяет интерфейс для создания взаимосвязанных объектов, а "Строитель" отвечает за создание отдельных частей сложного объекта. [PreviousВозможные реализации для решения конкретных задач на С++chevron-left](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/prototype/vozmozhnye-realizacii-dlya-resheniya-konkretnykh-zadach-na-s++) [NextРеализации на С++chevron-right](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/builder/realizacii-na-s++) Last updated 1 year ago * [Проблема](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/builder#problema) * [Назначение](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/builder#naznachenie) * [Решаемые задачи](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/builder#reshaemye-zadachi) * [UML диаграмма](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/builder#uml-diagramma) * [Преимущества](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/builder#preimushestva) * [Недостатки](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/builder#nedostatki) * [Связь с другими паттернами](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/builder#svyaz-s-drugimi-patternami) sun-brightdesktopmoon sun-brightdesktopmoon --- # Прототип | Введение в паттерны [hashtag](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/prototype#problemy) Проблемы ----------------------------------------------------------------------------------------------------------- Представим, что вам потребовалось создать каркасную модель сферы из полигонов. Обычно таких полигонов очень много и при их создании необходимо вычислять координаты. Кроме того, в методы для создания объектов требуется передавать объект класса Creator ([зачем нужен?](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/factory-method#naznachenie) ). Более простым способом создания объекта может быть его копирование из существующего. В итоге: * Необходимость передачи объекта класса Creator в методы для создания объектов * Необходимость большого количества информации и времени для создания нового объекта [hashtag](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/prototype#naznachenie) Назначение ---------------------------------------------------------------------------------------------------------------- Прототип (Prototype) — это порождающий паттерн проектирования, который поручает создание копий объектов самим копируемым объектам. Для этого в базовый класс добавляется метод для копирования, который создает новый объект на основе существующего. Паттерн вводит общий интерфейс для всех объектов, поддерживающих копирование. Это позволяет копировать объекты, не привязываясь к их классам. [hashtag](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/prototype#reshaemye-zadachi) Решаемые задачи --------------------------------------------------------------------------------------------------------------------------- * Копирование объектов Дает возможность создавать копии объектов на основе других объектов. * Создание сложных объектов Паттерн прототип предоставляет альтернативу созданию подклассов для конструирования сложных объектов. Вместо того, чтобы создавать множество подклассов для каждой вариации объекта, можно использовать прототипы и копирование, чтобы создавать новые объекты с нужными параметрами и состоянием. [hashtag](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/prototype#uml-diagramma) UML диаграмма --------------------------------------------------------------------------------------------------------------------- ![](https://y2kot.gitbook.io/untitled/~gitbook/image?url=https%3A%2F%2F4012669134-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FZZOFvJdMaAKUXTNhFX2E%252Fuploads%252Fgit-blob-c2de62adb7d1e5a4ff934fa2dad38bab1c0e6e25%252Fprotorype_white.png%3Falt%3Dmedia&width=768&dpr=3&quality=100&sign=d450630&sv=2) UML диаграмма паттерна "Прототип" [hashtag](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/prototype#preimushestva) Преимущества -------------------------------------------------------------------------------------------------------------------- 1. Возможность создавать новые объекты, используя уже существующие объекты в качестве прототипов. 2. Увеличение скорости создания сложных объектов. 3. Нет необходимости в передаче объекта класса Creator в методы для создания объектов. [hashtag](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/prototype#nedostatki) Недостатки --------------------------------------------------------------------------------------------------------------- 1. Необходимо убедиться в добавлении метода копирования в каждый класс, объект которого может быть скопирован. 2. Копируется внутреннее состояние объекта, в том числе значения приватных полей. [hashtag](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/prototype#svyaz-s-drugimi-patternami) Связь с другими паттернами ----------------------------------------------------------------------------------------------------------------------------------------------- 1. Паттерн [Строитель](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/builder) может использовать прототипы для создания копий подобъектов. [PreviousВозможные реализации для решения конкретных задач на С++chevron-left](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/abstract-factory/vozmozhnye-realizacii-dlya-resheniya-konkretnykh-zadach-na-s++) [NextРеализации на С++chevron-right](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/prototype/realizacii-na-s++) Last updated 1 year ago * [Проблемы](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/prototype#problemy) * [Назначение](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/prototype#naznachenie) * [Решаемые задачи](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/prototype#reshaemye-zadachi) * [UML диаграмма](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/prototype#uml-diagramma) * [Преимущества](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/prototype#preimushestva) * [Недостатки](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/prototype#nedostatki) * [Связь с другими паттернами](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/prototype#svyaz-s-drugimi-patternami) sun-brightdesktopmoon sun-brightdesktopmoon --- # Одиночка | Введение в паттерны [hashtag](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/singleton#problema) Проблема ----------------------------------------------------------------------------------------------------------- Необходимость в создании одного экземпляра конкретного объекта. circle-info Примером такого объекта может являться объект базы данных. Такие объекты нельзя клонировать или копировать, объект должен быть один во всей системе. Это необходимо для того, чтобы избежать проблем с целостностью и согласованностью данных. [hashtag](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/singleton#naznachenie) Назначение ---------------------------------------------------------------------------------------------------------------- Одиночка (Singleton) – это порождающий паттерн проектирования, который гарантирует, что будет создан только один экземпляр класса, и предоставляет к нему глобальную точку доступа. [hashtag](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/singleton#reshaemye-zadachi) Решаемые задачи --------------------------------------------------------------------------------------------------------------------------- * Контроль за объектом. Паттерн гарантирует, что у класса есть только один экземпляр [hashtag](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/singleton#preimushestva) Преимущества -------------------------------------------------------------------------------------------------------------------- 1. Гарантия наличия единственного экземпляра объекта. 2. Предоставление глобальной точки доступа к объекту. 3. Оптимизация использования ресурсов. [hashtag](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/singleton#nedostatki) Недостатки --------------------------------------------------------------------------------------------------------------- 1. Создает проблемы с модификацией, расширением и управлением объектом. 2. Решение о том, какой объект создавать, не может приниматься при выполнении программы. 3. Создается глобальный объект и теряется контроль над его жизненным циклом. [PreviousРеализации на Kotlinchevron-left](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/builder/realizacii-na-kotlin) [NextРеализации на C++chevron-right](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/singleton/realizacii-na-c++) Last updated 1 year ago * [Проблема](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/singleton#problema) * [Назначение](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/singleton#naznachenie) * [Решаемые задачи](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/singleton#reshaemye-zadachi) * [Преимущества](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/singleton#preimushestva) * [Недостатки](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/singleton#nedostatki) sun-brightdesktopmoon sun-brightdesktopmoon --- # Пул объектов | Введение в паттерны [hashtag](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/object-pull#problema) Проблема ------------------------------------------------------------------------------------------------------------- * Требуется ограниченное количество объектов одного класса. * Переиспользование сложных объектов circle-info Представь, что у тебя есть домашний Wi-Fi роутер. Вместо того чтобы каждый раз, когда устройство в доме нуждается в подключении к Интернету, создавать новое подключение к провайдеру интернета и разрывать его после использования, ты можешь использовать пул подключений. [hashtag](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/object-pull#naznachenie) Назначение ------------------------------------------------------------------------------------------------------------------ Пул объектов (Object pool) – это порождающий паттерн проектирования, который предоставляет ограниченный набор инициализированных, по мере необходимости, и готовых для использования объектов. Используется для повышения производительности и управления ресурсами путем повторного использования предварительно созданных объектов вместо создания новых. Это полезно в случаях, когда создание объектов требует значительных ресурсов, таких как соединения с базой данных. [hashtag](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/object-pull#reshaemye-zadachi) Решаемые задачи ----------------------------------------------------------------------------------------------------------------------------- * Централизованное управление доступом. Обеспечивает централизованное управление доступом к объектам пула * Контроль и ограничение доступа. Позволяет контролировать и ограничивать количество одновременно используемых объектов. * Повышение производительности. Повторное использование объектов позволяет избежать увеличение затрачиваемых ресурсов на создание и уничтожение объектов. * Управление жизненным циклом объектов. Упрощает управление жизненным циклом объектов, так как клиенту не нужно явно создавать и уничтожать объекты, а просто получать и возвращать их в пул. [hashtag](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/object-pull#preimushestva) Преимущества ---------------------------------------------------------------------------------------------------------------------- 1. Повышается производительность за счет минимизации создания и уничтожения множества объектов. 2. Возможность ограничивать и контролировать число используемых объектов. 3. Возможность переиспользовать объект. [hashtag](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/object-pull#nedostatki) Недостатки ----------------------------------------------------------------------------------------------------------------- 1. Функция очистки, создания, удаления объекта. Возможность утечки информации. Если объект не очищается или его состояние не сбрасывается перед возвращением в пул, может возникнуть утечка информации. Например, если объект содержит конфиденциальные данные или ссылки на другие объекты, эта информация может остаться в объекте после его возврата в пул. 2. Увеличение объема кода. Внедрение паттерна требует создания дополнительной логики для управления пулом объектов, обработки доступа к объектам, контроля их состояния. 3. Усложнение архитектуры приложения. 4. В некоторых ситуациях сложная логика управления пулом. [PreviousВозможные реализации для решения конкретных задач на С++chevron-left](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/singleton/vozmozhnye-realizacii-dlya-resheniya-konkretnykh-zadach-na-s++) [NextРеализации на С++chevron-right](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/object-pull/realizacii-na-s++) Last updated 1 year ago * [Проблема](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/object-pull#problema) * [Назначение](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/object-pull#naznachenie) * [Решаемые задачи](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/object-pull#reshaemye-zadachi) * [Преимущества](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/object-pull#preimushestva) * [Недостатки](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/object-pull#nedostatki) sun-brightdesktopmoon sun-brightdesktopmoon --- # Структурные паттерны | Введение в паттерны [hashtag](https://y2kot.gitbook.io/untitled/patterns/structural-patterns#obshee-opisanie) Общее описание ------------------------------------------------------------------------------------------------------------- **Структурные паттерны** - это группа шаблонов проектирования, которая решает задачи, связанные с организацией классов и объектов в более крупные структуры. * Структурные паттерны уровня класса используют наследование для составления композиций из интерфейсов и реализаций. * Вместо композиции интерфейсов или реализаций структурные паттерны уровня объекта компонуют объекты для получения новой функциональности. circle-info Дополнительная гибкость в последнем случае связана с возможностью изменить композицию объектов во время выполнения, что недопустимо для статической композиции классов. К структурным паттернам уровня класса можно отнести: [адаптер](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/adapter) и [мост](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/bridge) . К структурным паттернам уровня объекта можно отнести: [декоратор](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/dekorator) , [компоновщик](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/composite) , [заместитель](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/proxy) , [фасад](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/facade) . #### [hashtag](https://y2kot.gitbook.io/untitled/patterns/structural-patterns#ispolzuyutsya-sleduyushie-mekhanizmy) Используются следующие механизмы: * **Наследование** - это концепция, позволяющая описать новый класс на основе уже существующего с частично или полностью заимствующейся функциональностью. circle-info Класс, от которого производится наследование, называется базовым или родительским. Новый класс – потомком, наследником или производным классом. Базовый класс определяет интерфейс, а подклассы - реализацию. Структуры на основе наследования получаются статичными. * **Композиция** - построение структуры путем объединения объектов некоторых классов. circle-info Композиция позволяет получать структуры, которые можно изменять во время выполнения. [PreviousРеализации на С++chevron-left](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/object-pull/realizacii-na-s++) [NextАдаптерchevron-right](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/adapter) Last updated 1 year ago sun-brightdesktopmoon sun-brightdesktopmoon --- # Адаптер | Введение в паттерны [hashtag](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/adapter#naznachenie) Назначение ------------------------------------------------------------------------------------------------------------- Паттерн адаптер (Adapter) преобразует интерфейс одного класса в интерфейс другого, который ожидают клиенты. Адаптер обеспечивает совместную работу классов с несовместимыми интерфейсами, которая без него была бы невозможна. circle-info Контейнеры queue, priority\_queue и stack библиотеки стандартных шаблонов STL реализованы на базе последовательных контейнеров list, deque и vector, адаптируя их интерфейсы к нужному виду. Именно поэтому эти контейнеры называют контейнерами-адаптерами. [hashtag](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/adapter#reshaemye-zadachi) Решаемые задачи ------------------------------------------------------------------------------------------------------------------------ * Разделение ответственностей Согласно принципу единственной ответственности (Single Responsibility) один класс должен иметь одну область ответственности. Когда существует сущность на которую возложены 2 или более ответственностей, они разделяются посредством вынесения каждой в адаптер. Ответственности делаются независимыми друг от друга. * Подмена одного интерфейса на другой Позволяет преобразовывать интерфейс одного класса в интерфейс другого, который ожидают клиенты. circle-info Интерфейс является абстракцией, которая определяет, как объект может быть использован, независимо от его конкретной реализации. Он представляет из себя набор методов и свойств класса. * Использование сторонних библиотек Использовать класс из нестандартной библиотеки следует через адаптер. Делается это для решения проблем совместимости интерфейсов библиотеки и рабочей среды, адаптации кода к новым версиям библиотеки, устранения сильной зависимости кода от библиотеки. Возможность контролировать и модифицировать адаптер делает код более гибким и легким в сопровождении. * Расширение базового интерфейса circle-info Интерфейс базового класса в общем случае плохо расширять, так как нарушаются принципы инкапсуляции и единственной ответственности (Single Responsibility). Код становится тяжелее поддерживать и модифицировать. Появляется потребность в дополнительных проверках и приведениях типов при работе с указателями на базовый класс. circle-info При использовании адаптера расширение может относиться не к одному классу, а к целой иерархии классов. [hashtag](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/adapter#uml-diagramma) UML диаграмма ------------------------------------------------------------------------------------------------------------------ ![](https://y2kot.gitbook.io/untitled/~gitbook/image?url=https%3A%2F%2F4012669134-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FZZOFvJdMaAKUXTNhFX2E%252Fuploads%252Fgit-blob-5709e27341141d8c84cd5006855cb399362722be%252Fadapter_white.png%3Falt%3Dmedia&width=768&dpr=3&quality=100&sign=33455b53&sv=2) UML диаграмма паттерна "Адаптер" [hashtag](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/adapter#preimushestva) Преимущества ----------------------------------------------------------------------------------------------------------------- * отделяет и скрывает от клиента подробности преобразования различных интерфейсов * позволяет адаптировать интерфейс к требуемому * позволяет разделить роли сущности * дает возможность независимо развивать различные ответственности сущности * расширение интерфейса [hashtag](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/adapter#nedostatki) Недостатки ------------------------------------------------------------------------------------------------------------ * необходимость плодить много классов приводит к увеличению количества времени и памяти,необходимых для исполнения программы * дублирование кода (в различных конкретных адаптерах может требоваться одна и та же реализация методов) * часто адаптер должен иметь доступ к реализации класса [hashtag](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/adapter#svyaz-s-drugimi-patternami) Связь с другими паттернами -------------------------------------------------------------------------------------------------------------------------------------------- * [Мост](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/bridge) : структура паттерна мост аналогична структуре адаптера, но у моста иное назначение. Он отделяет интерфейс от реализации, чтобы то и другое можно было изменять независимо. Адаптер же призван изменить интерфейс существующего объекта. * [Фасад](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/facade) : адаптер может использоваться внутри фасада для обеспечения совместимости между подсистемами, имеющими несовместимые интерфейсы. * [Заместитель](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/proxy) : адаптер может служить в качестве простого заместителя для объекта, предоставляя тот же интерфейс, но с другой реализацией. * [Декоратор](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/dekorator) : оба паттерна имеют схожую структуру, но разные цели. Адаптер изменяет интерфейс объекта, в то время как декоратор расширяет функциональность объекта, не изменяя его интерфейса [PreviousСтруктурные паттерныchevron-left](https://y2kot.gitbook.io/untitled/patterns/structural-patterns) [NextРеализации на С++chevron-right](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/adapter/adapter-concrete-implementation) Last updated 1 year ago * [Назначение](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/adapter#naznachenie) * [Решаемые задачи](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/adapter#reshaemye-zadachi) * [UML диаграмма](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/adapter#uml-diagramma) * [Преимущества](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/adapter#preimushestva) * [Недостатки](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/adapter#nedostatki) * [Связь с другими паттернами](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/adapter#svyaz-s-drugimi-patternami) sun-brightdesktopmoon sun-brightdesktopmoon --- # Декоратор | Введение в паттерны [hashtag](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/dekorator#naznachenie) Назначение --------------------------------------------------------------------------------------------------------------- * Паттерн декоратор (Decorator) позволяет динамически добавлять новые обязанности объекту. Декораторы являются гибкой альтернативой порождению подклассов для расширения функциональности. * Рекурсивно декорирует основной объект. Предполагает возможность применять несколько декораторов последовательно, оборачивая один декоратор в другой. Каждый декоратор добавляет свою функциональность к объекту, а затем передает управление следующему декоратору в цепочке, пока не достигнет последнего. * Паттерн декоратор использует схему "обертываем подарок, кладем его в коробку, обертываем коробку". [hashtag](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/dekorator#reshaemye-zadachi) Решаемые задачи -------------------------------------------------------------------------------------------------------------------------- * динамическое, прозрачное для клиентов добавление обязанностей объектам * реализация обязанностей, которые могут быть сняты с объекта * применяется, когда расширение путем наследования по каким-то причинам неудобно или невозможно circle-info Наследование от некоторых классов может быть запрещено. [hashtag](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/dekorator#uml-diagramma) UML диаграмма -------------------------------------------------------------------------------------------------------------------- ![](https://y2kot.gitbook.io/untitled/~gitbook/image?url=https%3A%2F%2F4012669134-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FZZOFvJdMaAKUXTNhFX2E%252Fuploads%252Fgit-blob-d0a641270c6ec66c20da18baa2170582ab8273c4%252Fdecorator_white.png%3Falt%3Dmedia&width=768&dpr=3&quality=100&sign=868ffbb6&sv=2) UML диаграмма паттерна "Декоратор" [hashtag](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/dekorator#preimushestva) Преимущества ------------------------------------------------------------------------------------------------------------------- * Гибкость: возможность добавлять желаемую реализацию к любому классу. Появлется возможность "декорировать" декораторы. * Отсутсвие разрастания иерархии. * Позволяет избежать перегруженных функциями классов на верхних уровнях иерархии. * Возможность обращаться с декорированным объектом так же как и с исходной сущностью. * Отсутствие дублирования кода, данный код просто уходит в конкретный декоратор. [hashtag](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/dekorator#nedostatki) Недостатки -------------------------------------------------------------------------------------------------------------- * Снижение производительности программы. Не используя декораторы можно напрямую пользоваться методом класса. Декоратор же может долго полиморфно совершать цепочку вызовов, что сказывается на времени выполнения программы. * Вся ответственность за декорирование "ложится на плечи" программиста Нет сущности, которая бы полностью отвечала за последовательность декорирования: за порядок вызова и оборачивания декораторов * В случае если в цепочке вызовов декоратора появляется необходимость изменить какую-либо обертку или удалить ее, то приходится заново оборачивать исходный объект. * Необходимость в создании сущности, отвечающей за декорирование. [hashtag](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/dekorator#svyaz-s-drugimi-patternami) Связь с другими паттернами ---------------------------------------------------------------------------------------------------------------------------------------------- * [Компоновщик](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/composite) : декоратор можно рассматривать как вырожденный случай компоновщика с единственным компонентом. Однако Decorator добавляет новые обязанности и не предназначен для агрегирования объектов. * [Стратегия](https://y2kot.gitbook.io/untitled/patterns/behavioral-patterns/strategy) : декоратор хорошо совмещается с паттерном стратегия. Декоратор позволяет изменить внешний облик объекта, стратегия – его внутреннее содержание. Это два взаимодополняющих способа изменения объекта. * [Адаптерarrow-up-right](https://github.com/NikkiWay/Git-Book-Patterns/blob/main/patterns/structural-patterns/adapter.md) : если декоратор изменяет только обязанности объекта, но не его интерфейс, то адаптер придает объекту совершенно новый интерфейс. [PreviousВозможные реализации для решения конкретных задачchevron-left](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/adapter/vozmozhnye-realizacii-dlya-resheniya-konkretnykh-zadach) [NextРеализации на С++chevron-right](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/dekorator/realizacii-na-s++) Last updated 1 year ago * [Назначение](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/dekorator#naznachenie) * [Решаемые задачи](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/dekorator#reshaemye-zadachi) * [UML диаграмма](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/dekorator#uml-diagramma) * [Преимущества](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/dekorator#preimushestva) * [Недостатки](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/dekorator#nedostatki) * [Связь с другими паттернами](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/dekorator#svyaz-s-drugimi-patternami) sun-brightdesktopmoon sun-brightdesktopmoon --- # Реализации на Kotlin | Введение в паттерны [hashtag](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/abstract-factory/realizacii-na-kotlin#obshaya-realizaciya-na-yazyke-kotlin) Общая реализация на языке Kotlin ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- #### [hashtag](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/abstract-factory/realizacii-na-kotlin#opredelenie-obshego-interfeisa-instrumentov) Определение общего интерфейса инструментов Copy interface ITool { fun use() } #### [hashtag](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/abstract-factory/realizacii-na-kotlin#neposredstvennaya-realizaciya-konkretnykh-vidov-instrumentov) Непосредственная реализация конкретных видов инструментов AbstractHacksaw MetalHacksaw WoodHacksaw AbstractHammer MetalHammer WoodenHammer Copy abstract class AbstractHacksaw( private val type: String, private val name: String = SAW_NAME ) : ITool { override fun use() { println("Instrument: $name can be used for $type") } companion object { protected const val SAW_NAME: String = "Saw" } } Copy class MetalHacksaw : AbstractHacksaw(SAW_TYPE) { companion object { private const val SAW_TYPE = "Metal" } } Copy class WoodHacksaw : AbstractHacksaw(SAW_TYPE) { companion object { private const val SAW_TYPE = "Wood" } } #### [hashtag](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/abstract-factory/realizacii-na-kotlin#realizaciya-abstraktnykh-fabrik-instrumentov) Реализация абстрактных фабрик инструментов AbstractFactory MetalFactory WoodFactory #### [hashtag](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/abstract-factory/realizacii-na-kotlin#main) Main [PreviousРеализации на С++chevron-left](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/abstract-factory/realizacii-na-s++) [NextВозможные реализации для решения конкретных задач на С++chevron-right](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/abstract-factory/vozmozhnye-realizacii-dlya-resheniya-konkretnykh-zadach-na-s++) Last updated 1 year ago sun-brightdesktopmoon Copy abstract class AbstractHammer( private val type: String, private val name: String = HAMMER_NAME ) : ITool { override fun use() { println("Instrument: $name can be used for $type") } companion object { protected const val HAMMER_NAME: String = "Hammer" } } Copy class MetalHammer : AbstractHammer(HAMMER_TYPE) { companion object { private const val HAMMER_TYPE = "Metal" } } Copy class WoodenHammer : AbstractHammer(HAMMER_TYPE) { companion object { private const val HAMMER_TYPE = "Wood" } } Copy interface AbstractFactory { fun createHacksaw(): AbstractHacksaw fun createHammer(): AbstractHammer } Copy class MetalFactory : AbstractFactory { override fun createHammer(): MetalHammer { return MetalHammer() } override fun createHacksaw(): MetalHacksaw { return MetalHacksaw() } } Copy class WoodFactory : AbstractFactory { override fun createHammer(): WoodenHammer { return WoodenHammer() } override fun createHacksaw(): WoodHacksaw { return WoodHacksaw() } } Copy fun main() { val metalFactory = MetalFactory() val metalHammer: MetalHammer = metalFactory.createHammer() metalHammer.use() val metalHacksaw: MetalHacksaw = metalFactory.createHacksaw() metalHacksaw.use() val woodFactory = WoodFactory() val woodenHammer: WoodenHammer = woodFactory.createHammer() woodenHammer.use() val woodHacksaw: WoodHacksaw = woodFactory.createHacksaw() woodHacksaw.use() } sun-brightdesktopmoon --- # Реализации на Kotlin | Введение в паттерны [hashtag](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/prototype/realizacii-na-kotlin#obshaya-realizaciya-na-yazyke-kotlin) Общая реализация на языке Kotlin ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Candy Copy data class Candy( val name: String, val taste: String, val manufacture: String ) Copy fun main() { val myCandy = Candy("Mishka","delicious", "Noname") val sistersCandy = myCandy.copy() println("Is candies equals: ${myCandy == sistersCandy}") println("My candy: ${System.identityHashCode(myCandy)}") println("Sisters candy: ${System.identityHashCode(sistersCandy)}") } [PreviousРеализации на С++chevron-left](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/prototype/realizacii-na-s++) [NextРеализации на Javachevron-right](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/prototype/realizacii-na-java) Last updated 1 year ago sun-brightdesktopmoon sun-brightdesktopmoon --- # Реализации на Kotlin | Введение в паттерны [hashtag](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/singleton/realizacii-na-kotlin#obshaya-realizaciya-na-yazyke-kotlin) Общая реализация на языке Kotlin ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Singleton Copy object Singleton Copy fun main() { val single1 = Singleton val single2 = Singleton println("Are the same object: ${single1 == single2}") } [hashtag](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/singleton/realizacii-na-kotlin#ispolzovanie-lenivoi-inicializacii) Использование ленивой инициализации ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- LazySingleton Teacher Copy object LazySingleton { val lazyField: Teacher by lazy(LazyThreadSafetyMode.PUBLICATION) { Teacher(name = "Ivan", surname = "Ivanov") } } Copy data class Teacher( val name: String, val surname: String ) Copy fun main() { val single3 = LazySingleton.lazyField val single4 = LazySingleton.lazyField println("Are the same object: ${single3.name == single4.name && single3.surname == single4.surname}") } [PreviousРеализации на C++chevron-left](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/singleton/realizacii-na-c++) [NextВозможные реализации для решения конкретных задач на С++chevron-right](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/singleton/vozmozhnye-realizacii-dlya-resheniya-konkretnykh-zadach-na-s++) Last updated 1 year ago * [Общая реализация на языке Kotlin](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/singleton/realizacii-na-kotlin#obshaya-realizaciya-na-yazyke-kotlin) * [Использование ленивой инициализации](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/singleton/realizacii-na-kotlin#ispolzovanie-lenivoi-inicializacii) sun-brightdesktopmoon sun-brightdesktopmoon --- # Реализации на Kotlin | Введение в паттерны [hashtag](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/builder/realizacii-na-kotlin#obshaya-realizaciya-na-yazyke-kotlin) Общая реализация на языке Kotlin ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- #### [hashtag](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/builder/realizacii-na-kotlin#realizaciya-klassa-mashiny-i-ee-komponentov) Реализация класса машины и ее компонентов Car Body Engine Suspension Copy class Car( val body: Body, val engine: Engine, val suspension: Suspension ) Copy abstract class Body(val bodyType: String) class SedanBody(bodyType: String) : Body(bodyType) Copy abstract class Engine(val capacity: Double) class InternalCombustionEngine(capacity: Double) : Engine(capacity) Copy abstract class Suspension(val type: String) class AirSuspension(type: String): Suspension(type) #### [hashtag](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/builder/realizacii-na-kotlin#realizaciya-builder-i-director) Реализация Builder и Director IBuilder CamryBuilder Director Copy interface IBuilder { fun withBody(body: Body): IBuilder fun withEngine(engine: Engine): IBuilder fun withSuspension(suspension: Suspension): IBuilder fun build(): Car } Copy class CamryBuilder : IBuilder { private var body: Body = SedanBody("sedan") private var engine: Engine = InternalCombustionEngine(2.5) private var suspension: Suspension = AirSuspension("mono-cylinder") override fun withBody(body: Body): CamryBuilder { this.body = body return this } override fun withEngine(engine: Engine): CamryBuilder { this.engine = engine return this } override fun withSuspension(suspension: Suspension): CamryBuilder { this.suspension = suspension return this } override fun build(): Car { return Car( body = body, engine = engine, suspension = suspension, ) } } Copy fun main() { val director = Director(CamryBuilder()) val camry = director.create() println( "Director created camry! " + "Body: ${camry.body.bodyType}, " + "engine: ${camry.engine.capacity}, " + "suspension: ${camry.suspension.type}" ) } [PreviousРеализации на С++chevron-left](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/builder/realizacii-na-s++) [NextОдиночкаchevron-right](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/singleton) Last updated 1 year ago sun-brightdesktopmoon Copy class Director(private val builder: IBuilder) { fun create(): Car = builder .withEngine(InternalCombustionEngine(3.5)) .build() } sun-brightdesktopmoon --- # Реализации на Kotlin | Введение в паттерны [hashtag](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/adapter/realizacii-na-kotlin#obshaya-realizaciya-na-yazyke-kotlin) Общая реализация на языке Kotlin --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- IThermometer CelsiusThermometer ITempAdapter FahrenheitTempAdapter Copy interface IThermometer { val temperature: Double } Copy class CelsiusThermometer : IThermometer { override val temperature: Double = DEFAULT_TEMPERATURE companion object { private const val DEFAULT_TEMPERATURE: Double = 15.0 } } Copy interface ITempAdapter { val temperature: Double } Copy class FahrenheitTempAdapter( private val thermometer: IThermometer ) : ITempAdapter { override val temperature: Double = thermometer.temperature * FACTOR + LINEAR_COEFFICIENT companion object { private const val FACTOR = 1.8 private const val LINEAR_COEFFICIENT = 32.0 } } Copy fun main() { val thermometer: IThermometer = CelsiusThermometer() println("Temperature in celsius: ${thermometer.temperature}") val adapter: ITempAdapter = FahrenheitTempAdapter(thermometer) println("Temperature in fahrenheit: ${adapter.temperature}") } [PreviousРеализации на С++chevron-left](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/adapter/adapter-concrete-implementation) [NextВозможные реализации для решения конкретных задачchevron-right](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/adapter/vozmozhnye-realizacii-dlya-resheniya-konkretnykh-zadach) Last updated 1 year ago sun-brightdesktopmoon sun-brightdesktopmoon --- # Реализации на С++ | Введение в паттерны [hashtag](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/prototype/realizacii-na-s++#obshaya-realizaciya-na-yazyke-s) Общая реализация на языке С++ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Car User Copy class Car { public: virtual ~Car() = default; virtual unique_ptr clone() = 0; }; class Sedan : public Car { public: Sedan() { cout << "Calling the default constructor;" << endl; } Sedan(const Sedan& car) { cout << "Calling the Copy constructor;" << endl; } ~Sedan() override { cout << "Calling the destructor;" << endl; } unique_ptr clone() override { return make_unique(*this); } }; [PreviousПрототипchevron-left](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/prototype) [NextРеализации на Kotlinchevron-right](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/prototype/realizacii-na-kotlin) Last updated 1 year ago sun-brightdesktopmoon Copy class User { public: void use(shared_ptr &car) { auto newCar = car->clone(); } }; Copy # include # include using namespace std; int main() { shared_ptr sedan = make_shared(); User{}.use(sedan); } sun-brightdesktopmoon --- # Мост | Введение в паттерны [hashtag](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/bridge#naznachenie) Назначение ------------------------------------------------------------------------------------------------------------ Мост (Bridge) - структурный паттерн, предназначенный для отделения абстракции от ее реализации так, чтобы была возможность изменять их независимо друг от друга. [hashtag](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/bridge#reshaemye-zadachi) Решаемые задачи ----------------------------------------------------------------------------------------------------------------------- * возможность выбирать реализацию во время выполнения программы Мост позволяет избежать постоянной привязки абстракции к реализации. * комбинирование разных абстракций и реализаций и изменение их независимо * избежание перекомпиляции клиентского кода при изменениях в реализации абстракции * полное сокрытие от клиентов реализации абстракции * разделение одной реализации между несколькими объектами и сокрытие деталей разделения от клиента * декомпозиция иерархии: позволяет управлять ростом и сложностью иерархии circle-info Зачастую иерархию разделяют на две части: абстракцию и реализацию. В некоторых случаях может потребоваться более чем две части для разделения иерархии на более гибкие и независимые компоненты. Количество частей зависит от конкретных требований и особенностей системы. [hashtag](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/bridge#uml-diagramma) UML диаграмма ----------------------------------------------------------------------------------------------------------------- ![](https://y2kot.gitbook.io/untitled/~gitbook/image?url=https%3A%2F%2F4012669134-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FZZOFvJdMaAKUXTNhFX2E%252Fuploads%252Fgit-blob-9847f946b624e990610258ec2175b09b5598d9c1%252Fbridge_white.png%3Falt%3Dmedia&width=768&dpr=3&quality=100&sign=e6cea312&sv=2) UML диаграмма паттерна "Мост" [hashtag](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/bridge#preimushestva) Преимущества ---------------------------------------------------------------------------------------------------------------- * избавление от дублирования кода circle-info Дублирование кода может возникать в случае, когда несколько реализаций содержат одинаковые методы. Данную проблему можно решить вынесением одинаковых методов на более высокий уровень абстракции. Однако такой подход вынуждает реализовывать вынесенные методы во всех остальных экземплярах реализации * позволяет иерархии не разрастаться * сокрытие деталей реализации от клиентов * возможность изменять реализацию во время выполнения программы [hashtag](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/bridge#nedostatki) Недостатки ----------------------------------------------------------------------------------------------------------- * увеличение времени выполнения * тяжелый процесс реализации паттерна: введение дополнительного уровня абстракции между "реализацией" и "абстракцией" Из-за дополнительных затрат на разработку паттерна и усложнения структуры кода появляется необходимость закладывать реализацию моста в систему на этапе проектирования * связь между абстрактными понятиями не всегда может быть выделена [hashtag](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/bridge#svyaz-s-drugimi-patternami) Связь с другими паттернами ------------------------------------------------------------------------------------------------------------------------------------------- * [Абстрактная фабрика](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/abstract-factory) : паттерн абстрактная фабрика может создать и сконфигурировать мост * [Адаптер](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/adapter) : для обеспечения совместной работы не связанных между собой классов прежде всего предназначен паттерн адаптер. Обычно он применяется в уже готовых системах. Мост же участвует в проекте с самого начала и призван поддерживать возможность независимого изменения абстракций и их реализаций. * [Компоновщик](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/composite) : мост и компоновщик могут совместно использоваться для создания сложных структур, состоящих из связанных объектов. * [Декоратор](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/dekorator) : мост может быть комбинирован с декоратором для добавления дополнительной функциональности к объектам абстракции и реализации. * [Стратегия](https://y2kot.gitbook.io/untitled/patterns/behavioral-patterns/strategy) : мост может быть реализован с использованием стратегии. В этом случае, абстракция содержит ссылку на объект стратегии, который предоставляет конкретную реализацию. Стратегия может быть легко заменена другой, не нарушая интерфейса абстракции. [PreviousРеализации на С++chevron-left](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/composite/realizacii-na-s++) [NextРеализации на С++chevron-right](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/bridge/realizacii-na-s++) Last updated 1 year ago --- # Реализации на С++ | Введение в паттерны [hashtag](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/abstract-factory/realizacii-na-s++#obshaya-realizaciya-na-yazyke-s) Общая реализация на языке С++ -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- BaseGraphics AbstractGraphFactory User Pen Brush Image Color Copy class BaseGraphics { public: virtual ~BaseGraphics() = 0; }; BaseGraphics::~BaseGraphics() {} class QtGraphics : public BaseGraphics { public: QtGraphics(shared_ptr im) { cout << "Calling the QtGraphics constructor;" << endl; } ~QtGraphics() override { cout << "Calling the QtGraphics destructor;" << endl; } }; [PreviousАбстрактная фабрикаchevron-left](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/abstract-factory) [NextРеализации на Kotlinchevron-right](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/abstract-factory/realizacii-na-kotlin) Last updated 1 year ago sun-brightdesktopmoon Copy class AbstractGraphFactory { public: virtual ~AbstractGraphFactory() = default; virtual unique_ptr createGraphics(shared_ptr im) = 0; virtual unique_ptr createPen(shared_ptr cl) = 0; virtual unique_ptr createBrush(shared_ptr cl) = 0; }; class QtGraphFactory : public AbstractGraphFactory { public: unique_ptr createGraphics(shared_ptr im) override { return make_unique(im); } unique_ptr createPen(shared_ptr cl) override { return make_unique(); } unique_ptr createBrush(shared_ptr cl) override { return make_unique(); } }; Copy class User { public: void use(shared_ptr& cr) { shared_ptr image = make_shared(); auto graphics = cr->createGraphics(image); } }; Copy class BasePen {}; class QtPen : public BasePen {}; Copy class BaseBrush {}; class QtBrush : public BaseBrush {}; Copy class Image {}; Copy class Color {}; Copy # include # include using namespace std; int main() { shared_ptr grfactory = make_shared(); unique_ptr us = make_unique(); us->use(grfactory); } sun-brightdesktopmoon --- # Реализации на С++ | Введение в паттерны [hashtag](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/builder/realizacii-na-s++#obshaya-realizaciya-na-yazyke-s) Общая реализация на языке С++ ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- Car CarBuilder Methods CarCreator User Copy class Car { public: virtual ~Car() = default; virtual void drive() = 0; }; class Sedan : public Car { public: Sedan() { cout << "Calling the Sedan constructor;" << endl; } ~Sedan() override { cout << "Calling the Sedan destructor;" << endl; } void drive() override { cout << "Calling the drive method;" << endl; } }; [PreviousСтроительchevron-left](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/builder) [NextРеализации на Kotlinchevron-right](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/builder/realizacii-na-kotlin) Last updated 1 year ago sun-brightdesktopmoon Copy class CarBuilder { public: virtual ~CarBuilder() = default; virtual bool buildEngine() = 0; virtual bool buildChassis() = 0; shared_ptr getCar(); protected: virtual shared_ptr create() = 0; shared_ptr car{ nullptr }; size_t part{ 0 }; }; class SedanBuilder : public CarBuilder { public: bool buildEngine() override { if (!part) ++part; if (part != 1) return false; cout << "Building part 1: Engine for Sedan;" << endl; return true; } bool buildChassis() override { if (part == 1) ++part; if (part != 2) return false; cout << "Building part 2: Chassis for Sedan;" << endl; } protected: shared_ptr create() override; }; Copy shared_ptr CarBuilder::getCar() { if (!car) { car = create(); } return car; } shared_ptr SedanBuilder::create() { if (part == 2) { car = make_shared(); } return car; } Copy class CarCreator { public: virtual ~CarCreator() = default; virtual shared_ptr create() = 0; }; class CarDirector : public CarCreator { public: CarDirector(shared_ptr builder) : br(builder) {} shared_ptr create() override { if (br->buildEngine() && br->buildChassis()) return br->getCar(); return nullptr; } private: shared_ptr br; }; Copy class User { public: void use(shared_ptr& creator) { shared_ptr car = creator->create(); if (car) car->drive(); } }; Copy # include # include using namespace std; int main() { shared_ptr builder = make_shared(); shared_ptr creator = make_shared(builder); User{}.use(creator); } sun-brightdesktopmoon --- # Возможные реализации для решения конкретных задач на С++ | Введение в паттерны [hashtag](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/singleton/vozmozhnye-realizacii-dlya-resheniya-konkretnykh-zadach-na-s++#shablon-odinochka-singleton) Шаблон одиночка (Singleton) ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Concepts Singleton Sun Copy template concept NotAbstractClass = is_class_v && !is_abstract_v; template concept CopyConstructible = requires(T t) { T(t); }; template concept Assignable = requires(T t1, T t2) { t1 = t2; }; template concept OnlyObject = NotAbstractClass && !CopyConstructible && !Assignable; Copy template class Singleton { private: static unique_ptr inst; public: template static Type& instance(Args&& ...args) { struct Proxy : public Type { Proxy(Args&& ...args) : Type(forward(args)...) {} }; if (!inst) inst = make_unique(forward(args)...); return *inst; } Singleton() = delete; Singleton(const Singleton&) = delete; Singleton& operator =(const Singleton&) = delete; }; template unique_ptr Singleton::inst{}; [PreviousРеализации на Kotlinchevron-left](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/singleton/realizacii-na-kotlin) [NextПул объектовchevron-right](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/object-pull) Last updated 1 year ago sun-brightdesktopmoon Copy class Sun { private: int age; double brightness; protected: Sun() = default; Sun(int n, double d) : age(n), brightness(d) { cout << "Calling the constructor;" << endl; } public: ~Sun() { cout << "Calling the destructor;" << endl; } void f() { cout << "age = " << age << "; brightness = " << brightness << endl; } Sun(const Sun&) = delete; Sun& operator =(const Sun&) = delete; }; Copy # include # include using namespace std; int main() { decltype(auto) d1 = Singleton::instance(1, 2.); decltype(auto) d2 = Singleton::instance(); d2.f(); } sun-brightdesktopmoon --- # Возможные реализации для решения конкретных задач на С++ | Введение в паттерны [hashtag](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/prototype/vozmozhnye-realizacii-dlya-resheniya-konkretnykh-zadach-na-s++#prototip.-idioma-nvi-non-virtual-interface) Прототип. Идиома NVI (Non-Virtual Interface) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Car Sedan LuxurySedan User Copy class Car { public: virtual ~Car() = default; unique_ptr clone(); private: virtual unique_ptr doClone() = 0; }; Copy class Sedan : public Car { public: Sedan() { cout << "Calling the default constructor;" << endl; } Sedan(const Sedan& car) { cout << "Calling the Copy constructor;" << endl; } ~Sedan() override { cout << "Calling the destructor;" << endl; } private: unique_ptr doClone() override { return make_unique(*this); } }; Copy # include # include # include using namespace std; int main() { try { shared_ptr luxsedan = make_shared(); User{}.use(luxsedan); } catch (exception& err) { cout << err.what() << endl; } } [hashtag](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/prototype/vozmozhnye-realizacii-dlya-resheniya-konkretnykh-zadach-na-s++#prototip-prototype-.-staticheskii-polimorfizm-crtp) Прототип (Prototype). «Статический полиморфизм» (CRTP) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Base Cloner Car User [hashtag](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/prototype/vozmozhnye-realizacii-dlya-resheniya-konkretnykh-zadach-na-s++#prototip-prototype-.-staticheskii-polimorfizm-crtp-i-mnozhestvennoe-nasledovanie) Прототип (Prototype). «Статический полиморфизм» (CRTP) и множественное наследование ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Base BaseCloner Cloner Car User [hashtag](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/prototype/vozmozhnye-realizacii-dlya-resheniya-konkretnykh-zadach-na-s++#prototip-prototype-.-kovariantnyi-virtualnyi-metod.-idiomy-crtp-i-nvi) Прототип (Prototype). Ковариантный виртуальный метод. Идиомы CRTP и NVI ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Cloner Car User [PreviousРеализации на Javachevron-left](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/prototype/realizacii-na-java) [NextСтроительchevron-right](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/builder) Last updated 1 year ago * [Прототип. Идиома NVI (Non-Virtual Interface)](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/prototype/vozmozhnye-realizacii-dlya-resheniya-konkretnykh-zadach-na-s++#prototip.-idioma-nvi-non-virtual-interface) * [Прототип (Prototype). «Статический полиморфизм» (CRTP)](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/prototype/vozmozhnye-realizacii-dlya-resheniya-konkretnykh-zadach-na-s++#prototip-prototype-.-staticheskii-polimorfizm-crtp) * [Прототип (Prototype). «Статический полиморфизм» (CRTP) и множественное наследование](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/prototype/vozmozhnye-realizacii-dlya-resheniya-konkretnykh-zadach-na-s++#prototip-prototype-.-staticheskii-polimorfizm-crtp-i-mnozhestvennoe-nasledovanie) * [Прототип (Prototype). Ковариантный виртуальный метод. Идиомы CRTP и NVI](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/prototype/vozmozhnye-realizacii-dlya-resheniya-konkretnykh-zadach-na-s++#prototip-prototype-.-kovariantnyi-virtualnyi-metod.-idiomy-crtp-i-nvi) sun-brightdesktopmoon Copy class LuxurySedan : public Sedan { }; unique_ptr Car::clone() { unique_ptr carClone = doClone(); if (typeid(*carClone) != typeid(*this)) throw runtime_error("Error clone!"); return carClone; } Copy class User { public: void use(shared_ptr &car) { auto newCar = car->clone(); } }; Copy class Base { public: virtual ~Base() = default; virtual unique_ptr clone() const = 0; virtual ostream& print(ostream& os) const = 0; }; Copy template concept Abstract = is_abstract_v; template class Cloner : public Base { public: unique_ptr clone() const override { return make_unique(static_cast(*this)); } }; // Cloner C++23 template struct Cloner : public Base { template unique_ptr clone(this Selt&& self) const override { return unique_ptr(new Self(self)); } }; Copy class Car : public Cloner { private: int serialNum; public: Car(int d) : serialNum(d) { cout << "Calling the constructor;" << endl; } Car(const Car& car) : serialNum(car.serialNum) { cout << "Calling the Copy constructor;" << endl; } ~Car() override { cout << "Calling the destructor;" << endl; } ostream& print(ostream& os) const override { return os << "serialNum = " << serialNum; } }; // Car in C++23 class Car : public Cloner { private: int serialNum; public: Car(int d) : serialNum(d) {} ostream& print(ostream& os) const override { return os << "serialNum = " << serialNum; } }; Copy ostream& operator <<(ostream& os, const unique_ptr& obj) { return obj->print(os); } class User { public: void use(unique_ptr& vehicle) { auto newVehicle = vehicle->clone(); cout << newVehicle << endl; } }; Copy # include # include # include using namespace std; int main() { unique_ptr vehicle = make_unique(10); User{}.use(vehicle); } Copy class Base { public: virtual ~Base() = default; unique_ptr clone() const; virtual ostream& print(ostream& os) const = 0; }; unique_ptr Base::clone() const { return dynamic_cast(this)->doClone(); } ostream& operator <<(ostream& os, const unique_ptr& obj) { return obj->print(os); } Copy class BaseCloner { public: virtual unique_ptr doClone() const = 0; }; Copy template class Cloner : public BaseCloner { public: unique_ptr doClone() const override { return make_unique(static_cast(*this)); } }; Copy class Car : public Base, public Cloner { private: int serialNum; public: Car(int d) : serialNum(d) { cout << "Calling the constructor;" << endl; } Car(const Car& car) : serialNum(car.serialNum) { cout << "Calling the Copy constructor;" << endl; } ~Car() override { cout << "Calling the destructor;" << endl; } ostream& print(ostream& os) const override { return os << "serialNum = " << serialNum; } }; Copy class User { public: void use(unique_ptr& vehicle) { auto newVehicle = vehicle->clone(); cout << newVehicle << endl; } }; Copy # include # include # include using namespace std; int main() { unique_ptr vehicle = make_unique(10); User{}.use(vehicle); } Copy struct NullType { }; template struct Cloner : public Base { virtual ~Cloner() = default; unique_ptr clone() const { return unique_ptr(static_cast(this->doClone())); } protected: virtual Cloner* doClone() const { return new Derived(*static_cast(this)); } }; Copy class Car : public Cloner { public: Car() { cout << "Calling the car default constructor;" << endl; } Car(const Car& car) { cout << "Calling the car Copy constructor;" << endl; } ~Car() override { cout << "Calling the car destructor;" << endl; } virtual ostream& print(ostream& os) const { return os << "Car"; } }; class Sedan : public Cloner { public: Sedan() { cout << "Calling the sedan default constructor;" << endl; } Sedan(const Sedan& car) { cout << "Calling the sedan Copy constructor;" << endl; } ~Sedan() override { cout << "Calling the sedan destructor;" << endl; } ostream& print(ostream& os) const override { return os << "Sedan"; } }; Copy ostream& operator <<(ostream& os, const unique_ptr& vehicle) { return vehicle->print(os); } class User { public: void use(unique_ptr& vehicle) { auto newVehicle = vehicle->clone(); cout << newVehicle << endl; } }; Copy # include # include using namespace std; int main() { unique_ptr vehicle = make_unique(); User{}.use(vehicle); } sun-brightdesktopmoon --- # Реализации на Java | Введение в паттерны [hashtag](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/prototype/realizacii-na-java#obshaya-realizaciya-na-yazyke-java) Общая реализация на языке Java ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ CandyJava Copy public class CandyJava implements Cloneable { private final String name; private final String taste; private final String manufacture; public CandyJava(String name, String taste, String manufacture) { this.name = name; this.taste = taste; this.manufacture = manufacture; } public String getName() { return name; } public String getTaste() { return taste; } public String getManufacture() { return manufacture; } @Override public CandyJava clone() { try { return (CandyJava) super.clone(); } catch (CloneNotSupportedException e) { return null; } } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; CandyJava candyJava = (CandyJava) o; return Objects.equals(name, candyJava.name) && Objects.equals(taste, candyJava.taste) && Objects.equals(manufacture, candyJava.manufacture); } @Override public int hashCode() { return Objects.hash(name, taste, manufacture); } } [PreviousРеализации на Kotlinchevron-left](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/prototype/realizacii-na-kotlin) [NextВозможные реализации для решения конкретных задач на С++chevron-right](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/prototype/vozmozhnye-realizacii-dlya-resheniya-konkretnykh-zadach-na-s++) Last updated 1 year ago sun-brightdesktopmoon Copy fun main() { val myJavaCandy = CandyJava("Kitty","delicious", "Well known") val brothersJavaCandy = myJavaCandy.clone() println("Is java candies equals: ${myJavaCandy == brothersJavaCandy}") println("My java candy: ${System.identityHashCode(myJavaCandy)}") println("Brothers java candy: ${System.identityHashCode(brothersJavaCandy)}") } sun-brightdesktopmoon --- # Оглавление | Введение в паттерны [hashtag](https://y2kot.gitbook.io/untitled/patterns/oglavlenie#porozhdayushie-patterny) [Порождающие паттерны](https://y2kot.gitbook.io/untitled/patterns/oglavlenie#porozhdayushie-patterny) ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 1. [Фабричный метод (Factory Method)](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/factory-method) 2. [Абстрактная фабрика (Abstract Factory)](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/abstract-factory) 3. [Прототип (Prototype)](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/prototype) 4. [Строитель (Builder)](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/builder) 5. [Одиночка (Singleton)](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/singleton) 6. [Пулл объектов (Objects pull)](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/object-pull) [hashtag](https://y2kot.gitbook.io/untitled/patterns/oglavlenie#strukturnye-patterny) [Структурные паттерны](https://y2kot.gitbook.io/untitled/patterns/oglavlenie#strukturnye-patterny) ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 1. [Адаптер (Adapter)](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/adapter) 2. [Декоратор (Decorator)](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/dekorator) 3. [Компоновщик (Composite)](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/composite) 4. [Мост (Bridge)](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/bridge) 5. [Заместитель (Proxy)](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/proxy) 6. [Фасад (Facade)](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/facade) [hashtag](https://y2kot.gitbook.io/untitled/patterns/oglavlenie#povedencheskie-patterny) [Поведенческие паттерны](https://y2kot.gitbook.io/untitled/patterns/oglavlenie#povedencheskie-patterny) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 1. [Стратегия (Strategy)](https://y2kot.gitbook.io/untitled/patterns/behavioral-patterns/strategy) 2. [Команда (Command)](https://y2kot.gitbook.io/untitled/patterns/behavioral-patterns/command) 3. [Цепочка обязанностей (Chain of responsibility )](https://y2kot.gitbook.io/untitled/patterns/behavioral-patterns/chain-of-responsibility) 4. [Подписчик-издатель (Publisher-follower)](https://y2kot.gitbook.io/untitled/patterns/behavioral-patterns/follower-publisher) 5. [Посредник (Mediator)](https://y2kot.gitbook.io/untitled/patterns/behavioral-patterns/mediator) 6. [Посетитель (Visitor)](https://y2kot.gitbook.io/untitled/patterns/behavioral-patterns/visitor) 7. [Шаблонный метод (Template method)](https://y2kot.gitbook.io/untitled/patterns/behavioral-patterns/tamplate-method) 8. [Опекун (Memento)](https://y2kot.gitbook.io/untitled/patterns/behavioral-patterns/memento) 9. [Итератор (Iterator)](https://y2kot.gitbook.io/untitled/patterns/behavioral-patterns/iterator) 10. [Свойство (Property)](https://y2kot.gitbook.io/untitled/patterns/behavioral-patterns/property) [PreviousВведение в паттерныchevron-left](https://y2kot.gitbook.io/untitled) [NextПорождающие паттерныchevron-right](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns) Last updated 1 year ago --- # Реализации на C++ | Введение в паттерны [hashtag](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/singleton/realizacii-na-c++#obshaya-realizaciya-na-yazyke-s) Общая реализация на языке С++ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Sun circle-info Конструктор помечается модификатором private, чтобы объект класса нельзя было создать извне Copy class Sun { public: static shared_ptr instance() { class SunProxy : public Sun {}; static shared_ptr myInstance = make_shared(); return myInstance; } ~Sun() { cout << "Calling the destructor;" << endl; } void shine() { cout << "The sun is shining;" << endl; } Sun(const Sun&) = delete; Sun& operator =(const Sun&) = delete; private: Sun() { cout << "Calling the default constructor;" << endl; } }; [PreviousОдиночкаchevron-left](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/singleton) [NextРеализации на Kotlinchevron-right](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/singleton/realizacii-na-kotlin) Last updated 1 year ago sun-brightdesktopmoon Copy # include # include using namespace std; int main() { shared_ptr sun(Sun::instance()); sun->shine(); } sun-brightdesktopmoon --- # Реализации на С++ | Введение в паттерны [hashtag](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/object-pull/realizacii-na-s++#obshaya-realizaciya-na-yazyke-s) Общая реализация на языке С++ --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- EmployeePoolObject Employee EmployeePool instance() hireEmployee() fireEmployee() createEmployee() operator << Copy template concept EmployeePoolObject = requires(T t) { t.clockIn(); }; Copy class Employee { private: static size_t count; public: Employee() { cout << "Constructor(" << ++count << ");" << endl; } ~Employee() { cout << "Destructor(" << count-- << ");" << endl; } void clockIn() { cout << "Employee clocked in: 0x" << this << endl; } }; size_t Employee::count = 0; Copy # include # include # include # include using namespace std; int main() { shared_ptr> pool = EmployeePool::instance(); vector> vec(4); for (auto& elem : vec) elem = pool->hireEmployee(); pool->fireEmployee(vec[1]); cout << *pool << endl; shared_ptr ptr = pool->hireEmployee(); vec[1] = pool->hireEmployee(); cout << *pool << endl; } [PreviousПул объектовchevron-left](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/object-pull) [NextСтруктурные паттерныchevron-right](https://y2kot.gitbook.io/untitled/patterns/structural-patterns) Last updated 1 year ago sun-brightdesktopmoon Copy template class EmployeePool { public: static shared_ptr> instance(); shared_ptr hireEmployee(); bool fireEmployee(shared_ptr& employee); size_t count() const { return pool.size(); } EmployeePool(const EmployeePool&) = delete; EmployeePool& operator =(const EmployeePool&) = delete; private: vector>> pool; EmployeePool() {} pair> createEmployee(); template friend ostream& operator << (ostream& os, const EmployeePool& pl); }; Copy template shared_ptr> EmployeePool::instance() { static shared_ptr> myInstance(new EmployeePool()); return myInstance; } Copy template shared_ptr EmployeePool::hireEmployee() { size_t i; for (i = 0; i < pool.size() && pool[i].first; ++i); if (i < pool.size()) { pool[i].first = true; } else { pool.push_back(createEmployee()); } return pool[i].second; } Copy template bool EmployeePool::fireEmployee(shared_ptr& employee) { size_t i; for (i = 0; pool[i].second != employee && i < pool.size(); ++i); if (i == pool.size()) return false; employee.reset(); pool[i].first = false; pool[i].second->clockIn(); return true; } Copy template pair> EmployeePool::createEmployee() { return { true, make_shared() }; } Copy template ostream& operator << (ostream& os, const EmployeePool& pl) { for (auto elem : pl.pool) os << "{" << elem.first << ", 0x" << elem.second << "} "; return os; } sun-brightdesktopmoon --- # Реализации на С++ | Введение в паттерны [hashtag](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/adapter/adapter-concrete-implementation#obshaya-realizaciya-na-yazyke-s) Общая реализация на языке С++ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ includes BaseAdaptee ConcreteAdaptee Adapter ConcreteAdapter Methods Copy // подключаем нужные для работы программы библиотеки # include # include // подключаем пространство имен std using namespace std; Copy // класс BaseAdaptee является базовым описанием интерфейса, // который нуждается в адаптации class BaseAdaptee { public: virtual ~BaseAdaptee() = default; virtual void specificRequest() = 0; }; Copy // класс ConcreteAdaptee определяет существующий интерфейс, // который нуждается в адаптации // (реализует адаптируемый интерфейс) class ConcreteAdaptee : public BaseAdaptee { public: virtual void specificRequest() override { cout << "Method ConcreteAdaptee;" << endl; } }; Copy int main() { shared_ptr adaptee = make_shared(); shared_ptr adapter = make_shared(adaptee); adapter->request(); } [PreviousАдаптерchevron-left](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/adapter) [NextРеализации на Kotlinchevron-right](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/adapter/realizacii-na-kotlin) Last updated 1 year ago sun-brightdesktopmoon Copy // Adapter - базовый абстрактный класс для адапетров // Adapter адаптирует интерфейс Adaptee к зависящему от // предметной области интерфейсу, которым пользуется Client // Client - сущность, которая вступает во взаимоотношения с объектами, // удовлетворяющими интерфейсу class Adapter { public: virtual ~Adapter() = default; virtual void request() = 0; }; Copy // конкретная реализация экзмпляра BaseAdapter // ConcreteAdapter адаптирует интерфейс BaseAdaptee к интерфейсу Adapter, // чтобы клиентский код мог использовать адаптируемый класс через адаптер class ConcreteAdapter : public Adapter { private: shared_ptr adaptee; public: ConcreteAdapter(shared_ptr ad) : adaptee(ad) {} void request() override; }; Copy # pragma region Methods void ConcreteAdapter::request() { cout << "Adapter: "; if (adaptee) { adaptee->specificRequest(); } else { cout << "Empty!" << endl; } } sun-brightdesktopmoon --- # Реализации на Kotlin | Введение в паттерны [hashtag](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/dekorator/realizacii-na-kotlin#obshaya-realizaciya-na-yazyke-kotlin) Общая реализация на языке Kotlin ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ICoffee SimpleCoffee CoffeeDecorator MilkDecorator ellipsis Copy interface ICoffee { val cost: Int fun makeCoffee() } Copy class SimpleCoffee : ICoffee { override val cost: Int = BASE_COST override fun makeCoffee() { println("Simple coffee was made.") } companion object { private const val BASE_COST = 5 } } Copy abstract class CoffeeDecorator(private val coffee: ICoffee) : ICoffee { override val cost: Int = coffee.cost override fun makeCoffee() { coffee.makeCoffee() } } Copy class MilkDecorator(coffee: ICoffee) : CoffeeDecorator(coffee) { override val cost: Int = super.cost + MILK_COST override fun makeCoffee() { println("Milk was added.") } companion object { private const val MILK_COST = 2 } } Copy class SugarDecorator(coffee: ICoffee) : CoffeeDecorator(coffee) { override val cost: Int = super.cost + SUGAR_COST override fun makeCoffee() { println("Sugar was added.") } companion object { private const val SUGAR_COST = 1 } } Copy fun main() { val simpleCoffee: ICoffee = SimpleCoffee() simpleCoffee.makeCoffee() println("Current cost of coffee is: ${simpleCoffee.cost}") val milkCoffee: ICoffee = MilkDecorator(simpleCoffee) milkCoffee.makeCoffee() println("Current cost of coffee is: ${milkCoffee.cost}") val milkAndSugarCoffee: ICoffee = SugarDecorator(milkCoffee) milkAndSugarCoffee.makeCoffee() println("Current cost of coffee is: ${milkAndSugarCoffee.cost}") } [PreviousРеализации на С++chevron-left](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/dekorator/realizacii-na-s++) [NextКомпоновщикchevron-right](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/composite) Last updated 1 year ago --- # Возможные реализации для решения конкретных задач | Введение в паттерны [hashtag](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/adapter/vozmozhnye-realizacii-dlya-resheniya-konkretnykh-zadach#shablonnyi-adapter) Шаблонный адаптер ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- includes Interface Adapter AdapteeA AdapteeB initialize Copy # include # include # include using namespace std; Copy class Interface { public: virtual ~Interface() = default; virtual void request() = 0; }; Copy template class Adapter : public Interface { public: using MethodPtr = void (Type::*)(); Adapter(shared_ptr o, MethodPtr m) : object(o), method(m) {} void request() override { ((*object).*method)(); } private: shared_ptr object; MethodPtr method; }; Copy int main() { auto v = initialize(); for (const auto& elem : v) elem->request(); } [PreviousРеализации на Kotlinchevron-left](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/adapter/realizacii-na-kotlin) [NextДекораторchevron-right](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/dekorator) Last updated 1 year ago sun-brightdesktopmoon Copy class AdapteeA { public: ~AdapteeA() { cout << "Destructor class AdapteeA;" << endl; } void specRequestA() { cout << "Method AdapteeA::specRequestA;" << endl; } }; Copy class AdapteeB { public: ~AdapteeB() { cout << "Destructor class AdapteeB;" << endl; } void specRequestB() { cout << "Method AdapteeB::specRequestB;" << endl; } }; Copy auto initialize() { using InterPtr = shared_ptr; vector vec{ make_shared>(make_shared(), &AdapteeA::specRequestA), make_shared>(make_shared(), &AdapteeB::specRequestB) }; return vec; } sun-brightdesktopmoon --- # Реализации на С++ | Введение в паттерны [hashtag](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/composite/realizacii-na-s++#obshaya-realizaciya-na-yazyke-s) Общая реализация на языке С++ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ includes usings Component Figure Camera Composite ellipsis Copy # include # include # include # include Copy using namespace std; class Component using PtrComponent = shared_ptr; using VectorComponent = vector; Copy class Component { public: using value_type = Component; using size_type = size_t; using iterator = VectorComponent::const_iterator; using const_iterator = VectorComponent::const_iterator; virtual ~Component() = default; virtual void operation() = 0; virtual bool isComposite() const { return false; } virtual bool add(initializer_list comp) { return false; } virtual bool remove(const iterator& it) { return false; } virtual iterator begin() const { return iterator(); } virtual iterator end() const { return iterator(); } }; Copy class Figure : public Component { public: virtual void operation() override { cout << "Figure method;" << endl; } }; Copy class Camera : public Component { public: virtual void operation() override { cout << "Camera method;" << endl; } }; Copy class Composite : public Component { private: VectorComponent vec; public: Composite() = default; Composite(PtrComponent first, ...); void operation() override; bool isComposite() const override { return true; } bool add(initializer_list list) override; bool remove(const iterator& it) override { vec.erase(it); return true; } iterator begin() const override { return vec.begin(); } iterator end() const override { return vec.end(); } }; Copy # pragma region Methods Composite::Composite(PtrComponent first, ...) { for (shared_ptr* ptr = &first; *ptr; ++ptr) vec.push_back(*ptr); } void Composite::operation() { cout << "Composite method:" << endl; for (auto elem : vec) elem->operation(); } bool Composite::add(initializer_list list) { for (auto elem : list) vec.push_back(elem); return true; } # pragma endregion Copy int main() { using Default = shared_ptr; PtrComponent fig = make_shared
(), cam = make_shared(); auto composite1 = make_shared(fig, cam, Default{}); composite1->add({ make_shared
(), make_shared() }); composite1->operation(); cout << endl; auto it = composite1->begin(); composite1->remove(++it); composite1->operation(); cout << endl; auto composite2 = make_shared(make_shared
(), composite1, Default()); composite2->operation(); } [PreviousКомпоновщикchevron-left](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/composite) [NextМостchevron-right](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/bridge) Last updated 1 year ago --- # Реализации на С++ | Введение в паттерны [hashtag](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/bridge/realizacii-na-s++#obshaya-realizaciya-na-yazyke-s) Общая реализация на языке С++ --------------------------------------------------------------------------------------------------------------------------------------------------------------------- includes Implementor Abstraction ConcreteImplementor Entity Copy # include # include using namespace std; Copy class Implementor { public: virtual ~Implementor() = default; virtual void operationImp() = 0; }; Copy class Abstraction { protected: shared_ptr implementor; public: Abstraction(shared_ptr imp) : implementor(imp) {} virtual ~Abstraction() = default; virtual void operation() = 0; }; Copy class ConcreteImplementor : public Implementor { public: virtual void operationImp() override { cout << "Implementor;" << endl; } }; Copy class Entity : public Abstraction { public: using Abstraction::Abstraction; virtual void operation() override { cout << "Entity: "; implementor->operationImp(); } }; Copy int main() { shared_ptr implementor = make_shared(); shared_ptr abstraction = make_shared(implementor); abstraction->operation(); } [PreviousМостchevron-left](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/bridge) [NextЗаместительchevron-right](https://y2kot.gitbook.io/untitled/patterns/structural-patterns/proxy) Last updated 1 year ago --- # Возможные реализации для решения конкретных задач на С++ | Введение в паттерны [hashtag](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/abstract-factory/vozmozhnye-realizacii-dlya-resheniya-konkretnykh-zadach-na-s++#abstraktnaya-fabrika-s-ispolzovaniem-generacii-ierarkhii-klassov) Абстрактная фабрика с использованием генерации иерархии классов ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Type List Reverse List Scatter Hierarchy Linear Hierarchy Concepts Copy # pragma region Type List class NullType {}; template struct TypeList; template <> struct TypeList<> {}; template struct TypeList { using Head = H; using Tail = NullType; }; template struct TypeList { using Head = H; using Tail = TypeList; }; #pragma endregion Type2Type BaseCreator AbstractFactory Creator ConcreteFactory BaseGraphics BasePen BaseBrush using User [PreviousРеализации на Kotlinchevron-left](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/abstract-factory/realizacii-na-kotlin) [NextПрототипchevron-right](https://y2kot.gitbook.io/untitled/patterns/creationals-patterns/prototype) Last updated 1 year ago sun-brightdesktopmoon Copy # pragma region Reverse List template struct Append; template struct Append, Type> { using Result = TypeList; }; template struct Append, Type> { using Result = TypeList; }; template struct Append, Type> { using Result = TypeList; }; template struct Reverse; template struct Reverse> { using Result = TypeList; }; template struct Reverse> { using Result = Append, Head>::Result; }; template struct Reverse> { using Result = Append>::Result, Head>::Result; }; # pragma endregion Copy template typename Unit> class ScatterHierarchy; template