#Абстрактная фабрика (Abstract Factory)
Это порождающий паттерн проектирования, который позволяет создавать семейства связанных объектов, не привязываясь к конкретным классам создаваемых объектов.
Другими словами, предоставляет интерфейс для создания семейств взаимосвязанных объектов, не специфицируя их конкретных классов.
Применимость
- система не должна зависеть от того, как создаются, компонуются и представляются входящие в нее объекты
- система должна настраиваться одним из семейств объектов
- входящие в семейство взаимосвязанные объекты спроектированы для совместной работы, и вы должны обеспечить выполнение этого ограничения
- вы хотите предоставить библиотеку объектов, раскрывая только их интерфейсы, но не реализацию
Отношения
- обычно во время выполнения создается единственный экземпляр класса конкретной реализации фабрики (MacFactory)
- абстрактная фабрика передоверяет создание объектов-продуктов своему подклассу (MacFactory)
Результаты
- изолируются конкретные классы, клиент не знает подробностей реализации классов, а взаимодействуют только через их абстрактные интерфейсы
- упрощается замена семейств продуктов
- гарантируется сочетаемость продуктов
- НЕ УПРОЩАЕТ задачу поддержки нового вида продукта, так как необходимо расширить интерфейс абстрактной фабрики, НО и всех его подклассов
#Строитель (Builder)
Это порождающий паттерн проектирования, который позволяет создавать сложные объекты пошагово. Строитель даёт возможность использовать один и тот же код строительства для получения разных представлений объектов
Применимость
- алгоритм сложного объекта не должен зависеть от того, из каких частей состоит объект и как они стыкуются между собой
- процесс конструирования должен обеспечивать различные представления конструируемого объекта
Отношения
- клиент создает объект-распорядитель Director и настраивает его нужным объектом-строителем Builder
- распорядитель уведомляет строителя о том, что нужно построить очередную часть продукта
- строитель обрабатывает запросы распорядителя и добавляет новые части к продукту
- клиент забирает продукт у строителя
Результаты
- позволяет изменять внутреннее представление продукта
- изолирует код, реализующий̆ конструирование и представление
- предоставляет более точный̆ контроль над процессом конструирования
#Фабричный метод (Factory Method)
Это паттерн, порождающий̆ классы.
Это порождающий паттерн, который определяет общий интерфейс для создания объектов в суперклассе, позволяя подклассам изменять тип создаваемых объектов.
Применимость
- классу заранее неизвестно, объекты каких классов ему нужно создавать
- класс спроектирован так, чтобы объекты, которые он создает, определялись подклассами
- класс делегирует свои обязанности одному из нескольких вспомогательных подклассов, и вам нужно локализовать информацию о том, какой̆ класс принимает эти обязанности на себя
Отношения
Создатель полагается на свои подклассы в определении фабричного метода, который̆ будет возвращать экземпляр подходящего конкретного продукта.
Результаты
Фабричные методы избавляют проектировщика от необходимости встраивать в код зависящие от приложения классы. Код имеет дело только с интерфейсом класса, поэтому он может работать с любыми определенными пользователями классами конкретных продуктов.
#Прототип (Prototype)
Это порождающий паттерн, который задает виды создаваемых объектов с помощью экземпляра-прототипа и создает новые объекты путем копирования этого прототипа
Применимость
Система не должна зависеть от того, как в ней создаются, компонуются и представляются продукты; кроме того:
- классы для создания экземпляров определяются во время выполнения, например с помощью динамической загрузки; или
- для того чтобы избежать построения иерархий классов или фабрик, па- раллельных иерархии классов продуктов; или
- экземпляры класса могут находиться в одном из не очень большого числа различных состояний.
Отношения
Клиент обращается к прототипу, чтобы тот создал свою копию.
Результаты
У прототипа те же самые результаты, что у абстрактной фабрики и строителя: он скрывает от клиента конкретные классы продуктов, уменьшая тем самым число известных клиенту имен. Кроме того, все эти паттерны позволяют клиентам работать с классами, специфичными для приложения, без модификаций.
Дополнительные преимущества паттерна:
- добавление и удаление продуктов во время выполнения
- определение новых объектов путем изменения значений
- уменьшение числа подклассов
- динамическая настройка конфигурации приложения классами
#Одиночка (Singleton)
Это порождающий паттерн проектирования, который гарантирует, что у класса есть только один экземпляр, и предоставляет к нему глобальную точку доступа.
Применимость
- должен существовать ровно один экземпляр некоторого класса, к которому может обратиться любой клиент через известную точку доступа
- единственный экземпляр должен расширяться путем порождения подклассов, а клиенты должны иметь возможность работать с расширенным экземпляром без модификации своего кода
Отношения
Клиенты получают доступ к экземпляру класса Singleton только через его операцию getInstance.
Результаты
- контролируемый доступ к единственному экземпляру
- возможность уточнения операций и представления. От класса Singleton можно порождать подклассы, а приложение легко настраивается экземпляром расширенного класса.