Краткий обзор шаблонов проектирования из книги Gang of Four (GoF)

Лучшие дизайнеры используют множество шаблонов проектирования

Шаблон проектирования

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

Категории шаблонов проектирования

В GoF (Gang of Four) у нас есть 3 категории шаблонов проектирования.

  1. Шаблоны создания
  2. Структурные модели
  3. Модели поведения

1. Творческие шаблоны

Эти шаблоны позволяют создавать объекты, скрывая логику создания, а не создавая экземпляры объектов. пример: инкапсуляция.

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

  • Singleton Pattern [Класс, который может существовать только в одном экземпляре]

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

Реализация Singleton имеет две общие черты:

  • Сделайте конструктор по умолчанию закрытым, чтобы другие объекты не могли использовать оператор new с классом Singleton.
  • Создайте статический метод создания, который действует как конструктор. Этот метод вызовет частный конструктор для создания объекта и сохранения его в статическом поле. В результате все последующие вызовы этого метода возвращают кэшированный объект.

  • Шаблон прототипа [полностью инициализированный экземпляр для копирования или клонирования]

Этот шаблон позволяет копировать существующие объекты, не делая ваш код зависимым от их классов.

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

Реализация clone метода очень похожа во всех классах. Метод создает объект текущего класса и переносит все значения полей старого объекта в новый. Вы даже можете копировать частные поля, потому что большинство языков программирования позволяют объектам получать доступ к закрытым полям других объектов, принадлежащих к тому же классу.

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

  • Шаблон построителя [отделяет построение объекта от его представления]

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

Шаблон Builder предполагает извлечение кода построения объекта из его собственного класса и перемещение его в отдельные объекты, называемые конструкторами.

  • Шаблон метода Factory [Создает экземпляр нескольких производных классов]

Этот шаблон решает проблему создания объектов без указания точного класса объекта, который будет создан. Это делается путем создания объектов путем вызова фабричного метода.

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

Либо указанный в интерфейсе и реализованный подклассами, либо реализованный в базовом классе и, возможно, переопределенный производными классами, а не вызовом конструктора.

  • Шаблон абстрактной фабрики [Создает экземпляр нескольких семейств классов]

Этот шаблон позволяет создавать семейства связанных объектов без указания их конкретных классов.

Он работает вокруг супер-фабрики, которая создает другие фабрики. Эту фабрику еще называют фабрикой фабрик.

2. Структурные модели

Структурные шаблоны отвечают за то, как классы и объекты объединяются в более крупные структуры. Шаблоны структурных классов используют наследование для создания интерфейсов или реализаций.

  • Составной шаблон[древовидная структура простых и составных объектов]

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

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

  • Шаблон адаптера [сопоставление интерфейсов разных классов]

Этот шаблон проектирования работает как мост между двумя несовместимыми интерфейсами. Этот тип шаблона проектирования относится к структурному шаблону, поскольку он сочетает в себе возможности двух независимых интерфейсов.

Вы можете создать адаптер. Это специальный объект, который преобразует интерфейс одного объекта так, чтобы его мог понять другой объект.

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

  • Шаблон моста [отделяет интерфейс объекта от его реализации]

Этот шаблон проектирования позволяет разделить большой класс или набор тесно связанных классов на две отдельные иерархии; абстракция и реализация, которые можно разрабатывать независимо друг от друга.

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

  • Шаблон декоратора [динамическое добавление обязанностей к объектам]

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

Этот шаблон создает класс декоратора, который обертывает исходный класс и предоставляет дополнительные функции, сохраняя сигнатуру методов класса нетронутой.

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

  • Фасадный шаблон [один класс, представляющий всю подсистему]

Этот шаблон предоставляет упрощенный интерфейс для библиотеки, платформы или любого другого сложного набора классов.

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

  • Шаблон прокси [объект, представляющий другой объект]

Этот шаблон проектирования позволяет предоставить замену или заполнитель для другого объекта. Прокси контролирует доступ к исходному объекту, позволяя вам выполнять какие-либо действия либо до, либо после того, как запрос дойдет до исходного объекта.

В этом шаблоне класс представляет функциональность другого класса. Этот тип шаблона проектирования относится к структурному шаблону.

  • Шаблон легковеса [мелкозернистый экземпляр, используемый для эффективного обмена]

Шаблон Flyweight в основном используется для уменьшения количества создаваемых объектов, уменьшения объема памяти и повышения производительности. Этот тип шаблона проектирования относится к структурному шаблону, поскольку этот шаблон предоставляет способы уменьшить количество объектов, тем самым улучшая объектную структуру приложения.

Проще говоря, этот шаблон позволяет разместить больше объектов в доступном объеме ОЗУ, разделяя общие части состояния между несколькими объектами вместо хранения всех данных в каждом объекте.

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

3. Поведенческие модели

В этих шаблонах проектирования определите общие шаблоны связи между объектами и реализуйте эти шаблоны. Эти шаблоны также связаны с алгоритмами и распределением обязанностей между объектами.

  • Шаблон итератора [Последовательный доступ к элементам коллекции]

Этот шаблон позволяет вам перемещаться по элементам коллекции, не раскрывая ее базовое представление. пример: список, стек, дерево и т. д.

Основная идея шаблона Iterator состоит в том, чтобы выделить поведение обхода коллекции в отдельный объект, называемый итератором.

  • Шаблон состояния [изменение поведения объекта при изменении его состояния]

В этом шаблоне мы создаем объекты, представляющие различные состояния, и объект контекста, поведение которого меняется по мере изменения его объекта состояния. Этот тип шаблона проектирования относится к шаблону поведения.

  • Шаблон команды [Инкапсулировать запрос команды в виде объекта]

Этот шаблон является шаблоном проектирования, управляемым данными, и относится к категории поведенческих шаблонов. Запрос помещается в объект как команда и передается вызывающему объекту.

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

  • Шаблон цепочки ответственности [способ передачи запроса между цепочкой объектов]

Как следует из названия, шаблон цепочки ответственности создает цепочку объектов-получателей для запроса. Этот шаблон разделяет отправителя и получателя запроса в зависимости от типа запроса.

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

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

  • Шаблон шаблона [Отложите точные шаги алгоритма до подкласса]

В этом шаблоне проектирования абстрактный класс предоставляет определенные способы/шаблоны для выполнения своих методов. Его подклассы могут переопределять реализацию метода по мере необходимости, но вызов должен быть таким же, как определено абстрактным классом.

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

  • Шаблон наблюдателя [способ уведомления об изменении ряда классов]

Этот шаблон проектирования используется, когда между объектами существует отношение «один ко многим», например, если один объект изменен, его зависимые объекты должны быть уведомлены автоматически.

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

  • Шаблон стратегии [инкапсулирует алгоритм внутри класса]

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

Мы создаем объекты, которые представляют различные стратегии, и объект контекста, поведение которого зависит от объекта стратегии.

Объект стратегии изменяет алгоритм выполнения контекстного объекта.

Ваше здоровье!