Метою використання легкої ваги є уникнути непотрібної ініціалізації об'єкта і, таким чином, заощадити місце. Як визначено GOF , об'єкт може мати два стани, внутрішній та зовнішній стан:
- Внутрішній стан: зберігається у легкій вазі; вона складається з інформації, незалежної від контексту махових ваг, що робить її зручною.
- Зовнішній стан: залежить від та змінюється залежно від контексту легкої ваги, тому не можна ділитися. Клієнтські об'єкти відповідають за передачу зовнішнього стану легкої ваги, коли вона цього потребує.
Припускаючи, що ми хочемо розробити просту програму редактора тексту, де кожен стовпець містить усі рядки тексту, а рядок може містити символи.
Дилема тут полягає в тому, як створити клас персонажів. Клас char c
"Характер" повинен бути основним (внутрішнім станом) об'єктом. Однак символ може мати шрифт і і розмір (зовнішній стан); таким чином нам потрібно зберігати його зовнішній стан на рядку (клієнта) та звертатися до нього за потреби. Для цього створено два списки, в яких зберігаються шрифти та розміри.
Дотримуючись схему Flyweight, символу тепер можна використовувати багаторазово, а на об'єкти посилаються з певного списку об'єктів (пуловий пул), який містить усі символи ( Character
об'єкти) ASCII .
Ось що я описав візуально:
Для друку «привіт» Character
потрібні лише 4 об’єкти замість 5. Після зміни шрифту нові об’єкти не потрібні; зауважте, що це було б неможливо, якби ми зберігали зовнішній стан у класі символів, наприклад,
class Character
{
char c;
int Size;
Font font;
....
}
Застосування цього шаблону на великих наборах даних призведе до значних оптимізацій щодо складності пам'яті програми та повторного використання об'єктів.