Java: ООП
Теория: Паттерны
!vimeo!(818909426)
Порождающие паттерны
Singleton (Одиночка)
Паттерн Singleton - это паттерн, который гарантирует, что у класса есть только один экземпляр и предоставляет глобальную точку доступа к этому экземпляру. Он часто используется для реализации кэшей, менеджеров соединений с базами данных и других ресурсов, которые должны быть единственными в приложении. Реализация Singleton в Java обычно включает в себя создание приватного конструктора и статического метода, который возвращает единственный экземпляр класса.
Ленивая разновидность паттерна Singleton — это вариация классического синглтона, которая создает экземпляр класса только при первом запросе, что может быть полезно для оптимизации ресурсов. В ленивом синглтоне экземпляр класса создается внутри статического метода, который проверяет, существует ли уже экземпляр, и если нет, создает его, что позволяет избежать создания экземпляра, если он не нужен.
Паттерн Singleton имеет несколько недостатков, включая трудности с тестированием и отладкой, поскольку глобальный доступ к экземпляру может сделать код более сложным и зависимым от конкретной реализации. Кроме того, синглтон может быть проблематичен в многопоточной среде, где несколько потоков могут попытаться создать экземпляр одновременно, что может привести к ошибкам и нестабильности.
Builder (Строитель)
Паттерн Builder - это паттерн, который позволяет создавать сложные объекты пошагово, отделяя процесс создания от представления конечного продукта. Этот паттерн полезен, когда необходимо создавать объекты с множеством параметров или когда процесс создания объекта сложен и требует нескольких шагов.
Отдельный класс билдера
Библиотека Lombok предоставляет аннотацию @Builder, которая позволяет автоматически генерировать код билдера для класса, избавляя разработчика от необходимости писать его вручную.
Паттерн Билдер имеет несколько недостатков, одним из которых является усложнение структуры кода из-за добавления дополнительных классов, что может сделать код более сложным и трудным для понимания. Другим недостатком является ограниченность паттерна в случае, когда объекты имеют сложные взаимосвязи и множество вариантов конфигурации, что может сделать его неэффективным и трудным для использования в таких ситуациях
Prototype (Прототип)
Паттерн Прототип — это порождающий паттерн проектирования, который позволяет создавать новые объекты на основе существующих, копируя их
Недостатки паттерна "Прототип" включают сложность клонирования составных объектов, так как для корректного копирования всех элементов дерева классов необходимо, чтобы они реализовывали интерфейс Cloneable, что может усложнить архитектуру. Кроме того, создание большого количества классов-прототипов может привести к усложнению структуры проекта и снижению его производительности из-за необходимости управления множеством экземпляров. Наконец, использование этого паттерна может увеличить потребление памяти, так как каждая копия объекта занимает дополнительное место, что может быть критично в ресурсозависимых приложениях.
Структурные паттерны
Composite (Компоновщик)
Паттерн "Компоновщик" (Composite) — это структурный паттерн, который позволяет объединять объекты в древовидные структуры для представления иерархий "часть-целое". Он позволяет клиентам работать с индивидуальными объектами и их композициями единообразно, что упрощает управление сложными структурами. Этот паттерн особенно полезен в ситуациях, когда необходимо обрабатывать группы объектов так же, как и отдельные экземпляры, например, в графических интерфейсах или файловых системах.
Decorator (Декоратор)
Паттерн "Декоратор" (Decorator) — это структурный паттерн проектирования, который позволяет динамически добавлять новые функциональные возможности объектам, оборачивая их в специальные классы-декораторы. Этот подход позволяет расширять поведение объектов без изменения их кода и без создания множества подклассов, что делает систему более гибкой и удобной для модификации
Facade (Фасад)
Паттерн "Фасад" (Facade) — это структурный паттерн проектирования, который предоставляет упрощенный интерфейс к сложной системе классов, библиотек или фреймворков. Он скрывает сложность внутренней реализации и облегчает взаимодействие с системой, позволяя клиентам использовать только необходимые методы без необходимости разбираться в деталях. Этот паттерн особенно полезен для упрощения работы с большими и сложными системами, делая их более доступными и удобными для использования



