Один из структурных шаблонов направлен на сокращение использования памяти за счет совместного использования как можно большего количества данных с похожими объектами.
Это особенно полезно при работе с большим количеством похожих объектов, где создание нового экземпляра для каждого объекта будет затратным с точки зрения потребления памяти.
ключевые понятия:
Внутреннее состояние: состояние, которое является общим для нескольких объектов, не зависит от контекста и остается одинаковым для разных объектов.
Внешнее состояние: состояние, уникальное для каждого объекта и передаваемое от клиента. Это состояние может меняться и не сохраняется в объекте Flyweight
Ключевые участники:
Приспособленец: интерфейс, позволяющий объекту Приспособленца получать внешнее состояние и использовать его.
ConcreteFlyweight: реализует Flyweight и сохраняет внутреннее состояние.
FlyweightFactory: управляет объектами-приспособленцами и обеспечивает совместное использование интерфейсов. Возвращает существующий приспособитель, если он уже существует.
Клиент (например, основной класс): поддерживает ссылку на легковес и предоставляет внешнее состояние, когда ему необходимо взаимодействовать с объектом легковеса.
Давайте возьмем пример объекта-персонажа «Легкий вес»
Предположим, у нас есть текстовый редактор, которому необходимо отобразить большой объем текста. Каждый персонаж может быть представлен как объект, но создание отдельного объекта для каждого персонажа приведет к потере большого количества памяти. Вместо этого мы можем использовать Flyweights для совместного использования символьных объектов, представляющих каждую букву, и сохранять внешнее состояние, такое как положение или форматирование, вне
Наилегчайший вес
public interface Flyweight { public void display(int x, int y);//x, y are the extrinsic state of the Flyweight object }
Бетонный легковес
public class CharacterFlyweight implements Flyweight { private char ch; public CharacterFlyweight(char c){ this.ch = c; } @Override public void display(int x ,int y){ System.out.println("[drawing character: " this.ch " at co-ordinates:(" x "," y ")]"); } }
FlyweightFactory
public class FlyweightFactory { private static HashMapflyweights = new HashMap(); public static Flyweight getFlyweight(char c){ Flyweight flyweight = flyweights.getOrDefault(c,null); if(null==flyweight){ flyweight = new CharacterFlyweight(c); flyweights.put(c,flyweight); } return flyweight; } }
Основной
public class Main { public static void main(String args[]){ Flyweight flyweight1 = FlyweightFactory.getFlyweight('a'); Flyweight flyweight2 = FlyweightFactory.getFlyweight('b'); Flyweight flyweight3 = FlyweightFactory.getFlyweight('a');// will use the same object that is referenced by flyweight1 flyweight1.display(1, 2);//'a' displayed at 1,2 flyweight2.display(3, 4);//'b' displayed at 3,4 flyweight3.display(5, 7); // 'a'(shared) displayed at 5,7 } }
Выход:
[drawing character: a at co-ordinates:(1,2)] [drawing character: b at co-ordinates:(3,4)] [drawing character: a at co-ordinates:(5,7)]
Ключевые моменты
Недостатки
Сложность: шаблон может усложнить код, особенно при раздельном управлении внешними и внутренними состояниями.
Накладные расходы: если объектов для совместного использования мало, шаблон «Милегвес» может привести к ненужной сложности без значительной экономии памяти.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3