Данной публикацией хочу объеденить предыдущую серию публикаций о паттернах проектирования для более удобного прочтения.
Необходимость знания шаблонов проектирования.
Начнем с того, для чего нужны паттерны проектирования. Паттерны проектирования представляют собой шаблоны решений для различных задач, помогают сохранить архитектуру проекта последовательной и понятной, как для вас, так и для других разработчиков в команде, упрощают процесс проектирования, разработки и поддержки программного обеспечения.
Необходимо знать терминологию, названия, паттернов проектирования для обсуждения проекта с коллегами по команде.
Кроме того, паттерны проектирования позволяют увеличить скорость разработки и снизить временные затраты на проектирование и поддержку программного обеспечения.
В качестве полезных ссылок, на русском языке, для изучения паттернов проектирования:
https://refactoring.guru/ru(сайт заблокирован на территории РФ, используйте VPN)
https://github.com/evitwilly/Kotlin-Algorithms-and-Design-Patterns(код реализации некоторых паттернов проектирования на Kotlin, для практики чтения кода)
Классификация паттернов проектирования
В зависимости от постановки задачи, паттерны проектирования делятся на три вида: порождающие, структурные и поведенческие.
Далее будет приведено краткое описание данной классификации шаблонов проектирования.
Порождающие паттерны проектирования используются для создания сложных объектов. Эти паттерны помогают разработчикам строить сложные объекты с определенными функциями и возможностями, без необходимости реализации каждой детали вручную. Это помогает разработчикам быстрее и легче решать сложные задачи программирования.
Структурные паттерны проектирования предназначены для помощи в решении общих проблем проектирования. Дают возможность создавать программные архитектуры, которые могут поддерживаться и изменяться без изменений существующего кода, также помогают понять, как можно разделить код на модули, которые могут с легкостью тестироваться и поддерживаться.
Поведенческие паттерны проектирования используются для улучшения совместной работы объектов и классов. Они помогают разработчикам разделять логику приложения на независимые компоненты, а также обеспечивать ослабление связей между объектами. Это позволяет разработчикам изменять структуру приложения и масштабировать его в будущем.
Более подробно о порождающих паттернах
Данная часть будет посвящена описанию наиболее часто используемых порождающих паттернов.
Паттерн проектирования фабрика позволяет создавать объекты без указания их конкретных классов. Фабрика инкапсулирует процесс создания объектов и позволяет подменить классы создаваемых объектов без изменения кода клиентской части приложения. Фабрика также помогает избежать зависимостей между клиентским кодом и конкретными классами создаваемых объектов.
Фабрика используется для упрощения процесса создания объектов и предоставляет уровень абстракции между клиентским кодом и создаваемыми объектами. Она может быть основой для реализации паттерна проектирования «Абстрактная фабрика», который предоставляет интерфейс для создания семейств взаимосвязанных или зависимых объектов без указания их конкретных классов.
Паттерн проектирования строитель используется для создания сложных объектов путем разделения процесса их создания на несколько последовательных шагов. Это позволяет пользователям использовать одну и ту же последовательность действий для создания различных представлений одного и того же объекта. Полезен при необходимости создания большого количества различных объектов одного класса.
Паттерн проектирования прототип позволяет клонировать объекты без использования порождающих конструкторов. Он использует существующий объект-прототип, который используется как основа для создания нового объекта. Данный паттерн может быть полезен в случаях, когда постоянно необходимо клонировать объекты, но нет необходимости использовать порождающие конструкторы для создания новых объектов. В этом случае просто используется прототип для клонирования новых объектов. Кроме того, прототип может быть использован для инициализации новых объектов с определенными параметрами, а затем производить дополнительные изменения. В Kotlin, при использовании data class можно использовать метод clone(), который позволяет клонировать объект полностью или частично. https://stackoverflow.com/questions/49053432/how-to-clone-object-in-kotlin
Последним рассмотренным порождающим паттерном проектирования будет singleton, он гарантирует, что у объекта будет единственный экземпляр. Используется для обеспечения целостности данных и для предотвращения повторного создания экземпляра класса. В фреймворке Spring, аннотации @Component, @Servise, по умолчанию, используют представление в виде singleton - а.
Более подробно о структурных паттернах
Паттерн Адаптер позволяет объединить два несовместимых интерфейса в одном объекте, путем создания адаптера-переводчика между ними. То есть, Адаптер позволяет использовать уже существующий класс с несовместимым интерфейсом с другим классом, который ожидает другой интерфейс.
Фасад предоставляет простой интерфейс для упрощения работы с комплексными системами. Фасад может иметь урезанный интерфейс, не имеющий 100% функциональности, он предоставляет именно те функции, которые нужны клиенту, и скрывает все остальные.
Паттерн проектирования мост разделяет объект на две отдельные сущности. Одна из сущностей содержит базовую логику, а другая отвечает за реализацию конкретной функциональности. Такой подход позволяет избежать связанности и создать абстракцию, которая имеет большую гибкость и может быть легко модифицирована. Он подходит для ситуаций, когда в различных контекстах требуется разная функциональность.
Компоновщик используется для упрощения структуры объектов. Он позволяет объединять объекты в древовидную структуру, предоставляя интерфейс для управления этой структурой. Он также позволяет клиентам обращаться к отдельным объектам, как к целому. Компоновщик имеет смысл только тогда, когда основная модель вашей программы может быть структурирована в виде дерева.
Декоратор позволяет динамически добавлять объектам новую функциональность, не изменяя их исходного исходного кода(популярен в задачах Big Data). Это делается с помощью «оберток», которые оборачивают исходный объект и добавляют дополнительные функции. Это позволяет расширить функциональность объекта до нужного уровня без необходимости изменять его исходный код.
Паттерн проектирования легковес предлагает легкий способ разработки приложений для улучшения производительности. Данный паттерн проектирования предлагает не хранить в классе внешнее состояние, а передавать его в те или иные методы через параметры. Используется в случае, когда у вас дублируются “тяжелые” данные.
Заместитель позволяет подставлять вместо реального объекта заместителя, который может выполнять те же действия, но с дополнительной логикой. Он используется для делегирования задач от одного объекта к другому, предоставляя альтернативный интерфейс, который может быть более удобным.
Более подробно о порождающих паттернах
Цепочка обязанностей - предоставляется цепочка обработчиков, каждый из которых может обработать запрос или перенаправить его дальше по цепочке.
Итератор позволяет последовательно перебирать элементы коллекции без использования сложного кода и предоставляет абстракцию для доступа к элементам коллекции.
Паттерн команды представляет собой поведенческий паттерн проектирования, который использует объекты для представления команд. Паттерн позволяет отделить запросы от обработчиков, что делает код более гибким и легко масштабируемым. Он также позволяет инкапсулировать запросы и управлять ими в виде отдельных объектов, поэтому можно сохранять, выполнять и отменять запросы при необходимости.
Паттерн посредника представляет собой поведенческий паттерн проектирования, который использует объект, именуемый посредником, для управления взаимодействиями между несколькими объектами. Результатом использования этого паттерна является более легкое изменение и поддержка кода за счет разделения объектов-клиентов от взаимодействующих между собой объектов.
Наблюдатель создает механизм подписки, позволяющий одним объектам следить и реагировать на события, происходящие в других объектах. (мой любимый паттерн))
Паттерн снимка предоставляет способ сохранения простой копии состояния объекта для последующего использования. Он используется для сохранения и восстановления состояния объекта в будущем. Это полезно, когда необходимо иметь возможность вернуться к предыдущему состоянию объекта или использовать его состояние для дальнейшего использования. (особую популярность имеет в среде разработки методов оптимизации, где его наличие является обязательным).
Паттерн состояние позволяет объекту менять поведение в зависимости от внутреннего состояния. Он позволяет объектам внутри себя хранить свое состояние и менять поведение в зависимости от этого состояния.
Стратегия позволяет изменять алгоритмы и поведение объектов динамически. Он позволяет клиентскому коду выбрать из семейства алгоритмов определенный алгоритм, который лучше всего подходит для выполнения конкретных задач.
Шаблонный метод определяет основную структуру алгоритма, перекладывая некоторые шаги на подклассы. Это позволяет подклассам переопределять некоторые шаги алгоритма без изменения его структуры.
Паттерн посетитель предоставляет механизм, который позволяет вынести операции с объектами в отдельные классы. Это позволяет добавлять новые операции без изменения существующих классов. Паттерн посетитель используется для описания операций, которые могут быть выполнены над коллекцией объектов. Как правило, эти объекты принадлежат одному классу, и каждый из них может принимать посетителя. Посетитель может выполнять какие-либо действия с каждым из объектов и модифицировать их.