Порождающие паттерны (Creational Patterns)
Что такое порождающие паттерны?
Порождающие паттерны абстрагируют процесс создания объектов. Они помогают сделать систему независимой от того, как создаются, компонуются и представляются объекты.
Основные паттерны
- Singleton (Одиночка) — гарантирует единственный экземпляр класса
- Factory Method (Фабричный метод) — создает объекты через подклассы
- Abstract Factory (Абстрактная фабрика) — создает семейства связанных объектов
- Builder (Строитель) — создает сложные объекты пошагово
- Prototype (Прототип) — создает объекты путем клонирования
Подробное описание паттернов
Singleton (Одиночка)
Гарантирует, что у класса есть только один экземпляр, и предоставляет глобальную точку доступа к нему.
Когда использовать:
- Когда нужен только один экземпляр класса
- Когда требуется глобальная точка доступа
- Когда создание объекта дорого
Factory Method (Фабричный метод)
Определяет интерфейс для создания объекта, но позволяет подклассам изменять тип создаваемого объекта.
Когда использовать:
- Когда заранее неизвестно, объекты каких классов нужно создавать
- Когда класс делегирует создание объектов подклассам
Abstract Factory (Абстрактная фабрика)
Предоставляет интерфейс для создания семейств связанных объектов без указания их конкретных классов.
Когда использовать:
- Когда система должна быть независимой от способа создания объектов
- Когда нужно создавать семейства связанных объектов
Builder (Строитель)
Разделяет создание сложного объекта и его представление, позволяя использовать один и тот же процесс создания для получения различных представлений.
Когда использовать:
- Когда алгоритм создания сложного объекта не должен зависеть от частей, из которых состоит объект
- Когда процесс создания должен обеспечивать различные представления создаваемого объекта
Prototype (Прототип)
Определяет виды создаваемых объектов с помощью экземпляра-прототипа и создает новые объекты путем копирования этого прототипа.
Когда использовать:
- Когда классы, экземпляры которых создаются во время выполнения, определяются во время выполнения
- Когда создание объекта дороже копирования существующего
Примеры использования
Singleton
class DatabaseConnection {
static instance = null;
static getInstance() {
if (!DatabaseConnection.instance) {
DatabaseConnection.instance = new DatabaseConnection();
}
return DatabaseConnection.instance;
}
}
Factory Method
class AnimalFactory {
createAnimal(type) {
switch(type) {
case 'dog':
return new Dog();
case 'cat':
return new Cat();
default:
throw new Error('Unknown animal type');
}
}
}
Преимущества
- Инкапсулируют создание объектов
- Делают систему независимой от конкретных классов
- Упрощают добавление новых типов объектов
- Повышают переиспользуемость кода
Недостатки
- Могут усложнить архитектуру
- Некоторые паттерны могут снизить производительность
- Требуют дополнительного кода
Помните: используйте порождающие паттерны только тогда, когда они действительно решают вашу проблему!