Вопросы с собеседований по Java и ответы на них.
По рекламе: @tproger_sales_bot
Учиться у нас: clc.to/3wECtA
Для обратной связи: @proglibrary_feeedback_bot
Post #1330
1.15K
❓ Расскажите о паттерне Flyweight
Flyweight — это структурный паттерн, который позволяет вместить большее количество объектов в отведённую оперативную память за счёт разделения общего состояния между объектами.
Простыми словами: вместо создания тысяч похожих объектов, вы создаёте несколько объектов-легковесов с общими данными и передаёте уникальные данные извне при использовании.
▪️ Пример
Текстовый редактор, где каждая буква — это объект. Если создавать отдельный объект для каждой буквы с полным набором свойств (шрифт, размер, цвет), миллион символов займут гигабайты памяти.
▪️ Когда использовать
— Приложение создаёт огромное количество однотипных объектов
— Объекты потребляют много памяти
— Большую часть состояния можно вынести за пределы объекта
— Приложение не зависит от идентичности объектов (можно переиспользовать)
▪️ Минусы
— Усложнение кода из-за разделения состояния
— Flyweight должен быть immutable для безопасного переиспользования
🐸 Библиотека собеса по Java
#patterns
Flyweight — это структурный паттерн, который позволяет вместить большее количество объектов в отведённую оперативную память за счёт разделения общего состояния между объектами.
Простыми словами: вместо создания тысяч похожих объектов, вы создаёте несколько объектов-легковесов с общими данными и передаёте уникальные данные извне при использовании.
▪️ Пример
Текстовый редактор, где каждая буква — это объект. Если создавать отдельный объект для каждой буквы с полным набором свойств (шрифт, размер, цвет), миллион символов займут гигабайты памяти.
// Flyweight — легковес с общим состоянием
class CharacterStyle {
private final String font; // внутреннее состояние
private final int size; // (intrinsic)
private final String color;
public CharacterStyle(String font, int size, String color) {
this.font = font;
this.size = size;
this.color = color;
}
public void render(char character, int x, int y) { // внешнее состояние
System.out.println("Рендер '" + character +
"' в позиции (" + x + "," + y + ")");
}
}
// Фабрика для переиспользования flyweight-объектов
class StyleFactory {
private Map<String, CharacterStyle> styles = new HashMap<>();
public CharacterStyle getStyle(String font, int size, String color) {
String key = font + size + color;
return styles.computeIfAbsent(key,
k -> new CharacterStyle(font, size, color));
}
}
// Использование
StyleFactory factory = new StyleFactory();
// Миллион символов используют всего несколько объектов стилей
CharacterStyle arial12 = factory.getStyle("Arial", 12, "black");
arial12.render('H', 0, 0);
arial12.render('e', 10, 0);
arial12.render('l', 20, 0);
arial12.render('l', 30, 0);
arial12.render('o', 40, 0);
▪️ Когда использовать
— Приложение создаёт огромное количество однотипных объектов
— Объекты потребляют много памяти
— Большую часть состояния можно вынести за пределы объекта
— Приложение не зависит от идентичности объектов (можно переиспользовать)
▪️ Минусы
— Усложнение кода из-за разделения состояния
— Flyweight должен быть immutable для безопасного переиспользования
🐸 Библиотека собеса по Java
#patterns
- 🔥 4
- 👍 3
- ❤ 1
