Skip to main content

Яку проблему вирішує патерн Flyweight?

Flyweight (Пристосуванець) вирішує проблему надмірного споживання пам'яті, коли в системі потрібно створювати величезну кількість однотипних об'єктів, що містять повторювані дані.


1. Суть проблеми

Коли мільйони об'єктів мають однакові поля (наприклад, колір, шрифт, текстуру), зберігання цих даних у кожному екземплярі стає неефективним. Пам'ять витрачається на дублювання однакової інформації.


2. Що робить Flyweight

Патерн розділяє стан об'єкта на:

  • внутрішній (intrinsic) - спільний для всіх екземплярів,
  • зовнішній (extrinsic) - унікальний і передається ззовні під час використання.

Внутрішній стан зберігається в одному спільному об'єкті, який розділяється між безліччю клієнтів.


3. Приклад (Java)

java
class TreeType { private String name; private String color; private String texture; public void draw(int x, int y) { System.out.println("Малюємо " + name + " у (" + x + "," + y + ")"); } } class TreeFactory { private static Map<String, TreeType> cache = new HashMap<>(); public static TreeType getTreeType(String name, String color, String texture) { String key = name + color + texture; return cache.computeIfAbsent(key, k -> new TreeType(name, color, texture)); } } class Tree { private int x, y; // зовнішній стан private TreeType type; // внутрішній стан (спільний об'єкт) }

Тут мільйони Tree використовують одні й ті самі TreeType (колір, текстуру, форму).


4. Результат

  • Економія пам'яті: спільний стан зберігається в одному місці.
  • Швидка робота з великими колекціями однотипних об'єктів.

5. Коли застосовувати

  • У системах з великою кількістю однотипних об'єктів (графіка, ігрові сцени, кеш символів, текстові редактори).
  • Коли більшість даних об'єктів повторюється.

Підсумок: Flyweight вирішує проблему надлишкового дублювання даних, дозволяючи багатьом об'єктам розділяти спільний стан і тим самим різко знизити споживання пам'яті.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.