Яку проблему вирішує патерн Flyweight?
Flyweight (Пристосуванець) вирішує проблему надмірного споживання пам'яті, коли в системі потрібно створювати величезну кількість однотипних об'єктів, що містять повторювані дані.
1. Суть проблеми
Коли мільйони об'єктів мають однакові поля (наприклад, колір, шрифт, текстуру), зберігання цих даних у кожному екземплярі стає неефективним. Пам'ять витрачається на дублювання однакової інформації.
2. Що робить Flyweight
Патерн розділяє стан об'єкта на:
- внутрішній (intrinsic) - спільний для всіх екземплярів,
- зовнішній (extrinsic) - унікальний і передається ззовні під час використання.
Внутрішній стан зберігається в одному спільному об'єкті, який розділяється між безліччю клієнтів.
3. Приклад (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 вирішує проблему надлишкового дублювання даних, дозволяючи багатьом об'єктам розділяти спільний стан і тим самим різко знизити споживання пам'яті.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.