Легковаговик (шаблон проєктування)

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

У програмуванні, легковаговик[1][2](англ. flyweight pattern) — шаблон проєктування, за яким створюється об'єкт, що мінімізує використання пам'яті[en] розподіляючи стільки даних скільки це можливо між іншими подібними об'єктами; це спосіб використання великої кількості об'єктів, коли просте повторювання їх представлення зайняло б неприпустиму кількість пам'яті. Часто деякі частини, що зберігають стан об'єктів можуть бути спільними, і загальною практикою є тримати їх у деякий зовнішній структурі даних і передавати їх до об'єктів тимчасово коли вони використовуються.

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

Іншим прикладом застосування цього шаблону є метод стиснення текстових рядків шляхом інтернування[en].

Призначення[ред. | ред. код]

Використовується для ефективної підтримки (в першу чергу для зменшення затрат пам'яті) великої кількості дрібних об'єктів.

Опис[ред. | ред. код]

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

Переваги[ред. | ред. код]

  • Зменшує кількість об'єктів, що підлягають обробці.
  • Зменшує вимоги до пам'яті.

Недоліки[ред. | ред. код]

  • Переміщення стану поза об'єктом розбиває інкапсуляцію та може бути менш ефективним, ніж збереження власного поля

Застосування[ред. | ред. код]

Шаблон Легковаговик можна використовувати коли:

  • В програмі використовується велика кількість об'єктів.
  • Затрати на збереження високі через велику кількість об'єктів.
  • Більшість станів об'єктів можна зробити зовнішніми.
  • Велика кількість груп об'єктів може бути замінена відносно малою кількістю загальнодоступних об'єктів, однократно видаливши зовнішній стан.
  • Програма не залежить від ідентичності об'єктів. Оскільки об'єкти-легковаговики можуть використовуватися колективно, то тести на ідентичність будуть повертати значення "істина" ("true") для концептуально різних об'єктів.

Діаграма UML[ред. | ред. код]

Flyweight.gif

Реалізація[ред. | ред. код]

C++[ред. | ред. код]

C#[ред. | ред. код]

Java[ред. | ред. код]

Джерела[ред. | ред. код]

Література[ред. | ред. код]

Зноски[ред. | ред. код]

  1. https://refactoring.guru/uk/design-patterns/flyweight
  2. Будай, 2012, с. 42.