Что такое паттерн "Приспособленец" (Flyweight)
Приспособленец — структурный паттерн проектирования, который позволяет эффективно использовать память, разделяя общее состояние между множеством похожих объектов, вместо создания для каждого из них отдельного полного объекта. Это помогает значительно снизить расход ресурсов при большом количестве схожих объектов.
Представьте, что у вас есть текстовый редактор, который отображает огромное количество символов. Вместо того чтобы создавать отдельный объект для каждого символа с полной информацией, приспособленец разделяет общие данные (например, шрифт, стиль) и хранит уникальные части отдельно.
Преимущества паттерна «Приспособленец»
- Значительное уменьшение использования памяти.
- Повышение производительности при работе с большим количеством объектов.
- Централизация общего состояния.
Пример:
- Общие данные: шрифт, цвет символа.
- Уникальные данные: позиция символа в тексте.
Где применяется паттерн «Приспособленец»?
- Текстовые редакторы и системы рендеринга.
- Игры с множеством похожих объектов.
- Системы, где важна оптимизация памяти.
Пример реализации на JavaScript
// Приспособленец — общий объект с разделяемым состоянием class Flyweight { constructor(sharedState) { this.sharedState = sharedState; } operation(uniqueState) { console.log( `Общее состояние: ${JSON.stringify(this.sharedState)}, Уникальное состояние: ${JSON.stringify(uniqueState)}`, ); } } // Фабрика приспособленцев class FlyweightFactory { constructor() { this.flyweights = {}; } getFlyweight(sharedState) { const key = JSON.stringify(sharedState); if (!this.flyweights[key]) { this.flyweights[key] = new Flyweight(sharedState); console.log("Создан новый приспособленец."); } else { console.log("Используется существующий приспособленец."); } return this.flyweights[key]; } } // Использование const factory = new FlyweightFactory(); const fw1 = factory.getFlyweight({font: "Arial", size: 12, color: "black"}); fw1.operation({position: 1}); const fw2 = factory.getFlyweight({font: "Arial", size: 12, color: "black"}); fw2.operation({position: 2}); const fw3 = factory.getFlyweight({ font: "Times New Roman", size: 14, color: "red", }); fw3.operation({position: 3});
Когда стоит использовать паттерн «Приспособленец»?
- При необходимости работать с большим количеством объектов с похожими данными.
- Для оптимизации памяти и повышения производительности.
- Когда объекты можно разбить на общее (разделяемое) и уникальное состояние.
Отличие от других паттернов
- В отличие от прототипа, приспособленец фокусируется на разделении состояния для экономии ресурсов.
- Отличается от фабричного метода тем, что не создаёт новые объекты постоянно, а переиспользует существующие.
Плюсы паттерна
- Снижение использования памяти.
- Повышение производительности.
- Централизация и контроль общего состояния.
Минусы паттерна
- Усложнение кода из-за разделения состояния.
- Возможны ошибки при управлении уникальным и общим состоянием.
- Не всегда применим, если объекты слишком разные.