Celem zastosowania wzorca wagi lekkiej jest uniknięcie niepotrzebnej inicjalizacji obiektu, a tym samym oszczędność miejsca. Zgodnie z definicją GOF obiekt może mieć dwa stany: wewnętrzny i zewnętrzny:
- Stan wewnętrzny: jest przechowywany w wadze muchowej; składa się z informacji niezależnych od kontekstu wagi latającej, dzięki czemu można je udostępniać.
- Stan zewnętrzny: zależy i zależy od kontekstu wagi muchowej, dlatego nie można się nim dzielić. Obiekty klienta są odpowiedzialne za przekazywanie stanu zewnętrznego do wagi muchowej, gdy jej potrzebuje.
Zakładając, że chcemy opracować prostą aplikację do edytowania tekstu, w której każda kolumna zawiera wszystkie wiersze tekstu, a wiersz może zawierać znaki.
Dylemat polega na tym, jak zaprojektować klasę postaci. char c
W klasie znak powinien być główny (wewnętrzny stan) obiektu. Jednak znak może mieć czcionkę i rozmiar (stan zewnętrzny); dlatego musimy zapisać jego stan zewnętrzny w Row (kliencie) i uzyskać do niego dostęp w razie potrzeby. W tym celu tworzone są dwie listy przechowujące czcionki i rozmiary.
Postępując zgodnie ze wzorem Flyweight, Postać nadaje się do ponownego użycia, a obiekty są przywoływane z określonej listy obiektów (pula flyweight), która zawiera wszystkie symbole ( Character
obiekty) ASCII .
Oto, co opisałem wizualnie:
Do wydrukowania „cześć” Character
potrzebne są tylko 4 obiekty zamiast 5. Po zmianie czcionki nie są wymagane żadne nowe obiekty; zauważ, że nie byłoby to możliwe, gdybyśmy zapisali stan zewnętrzny w klasie Character, np.
class Character
{
char c;
int Size;
Font font;
....
}
Zastosowanie tego wzorca do dużych zestawów danych doprowadziłoby do znacznej optymalizacji złożoności pamięci aplikacji i możliwości ponownego użycia obiektu.