Studiowałem wzorce projektowe i natrafiłem na wzór ciężaru muchy. Próbowałem dostrzec możliwości użycia wzorca w moich aplikacjach, ale mam problemy z jego użyciem. A także, jakie są pewne oznaki, że podczas odczytywania kodu innych ludzi stosowany jest wzorzec wagi muchy?
Zgodnie z definicją mówi:
Udostępnianie pozwala efektywnie obsługiwać dużą liczbę drobnoziarnistych obiektów.
Jeśli dobrze to przeczytam Słowniki i tabele skrótów mogą być przykładami ciężarów much, czy to prawda?
Z góry dziękuję.
design-patterns
Jeremy E.
źródło
źródło
Odpowiedzi:
Jednym z przykładów są biblioteki Java. Java ma podstawowe typy (np.
int
32-bitową liczbę całkowitą) i opakowania dla nich (np.Integer
Które się zawijaint
). Istnieją metody „umieszczenia” polaint
wInteger
i rozpakowania plikuInteger
wint
. Opakowania są niezbędne, ponieważ pierwotne typy nie są obiektami, a zatem nie można ich np. Użyć jako kluczy wMap
s lub umieścić wCollection
s.Metoda bokserska wykorzystuje tablicę obiektów flyweight jako rodzaj pamięci podręcznej dla
Integer
s odpowiadającejint
wartościom między -128 a 127. Ponieważ są to wartości, które najprawdopodobniej zostaną użyte jako klucze lub umieszczone w kolekcjach, zmniejsza to przydział i użycie pamięci. (Jeśli 5000000Integer
s reprezentuje zmienną wartość 0, to zużywa 5000000 razy więcej pamięci niż ponowne użycie instancji flyweight).źródło
Grafika. Zazwyczaj obraz rastrowy (który jest podstawą większości grafik komputerowych na poziomie konsumenta) jest tani w procesorze, ale wymaga dużej ilości pamięci do pracy (co jest w porządku, ponieważ pamięć jest tania, ale procesor jest drogi). Jeśli ten obraz rastrowy ma być wielokrotnie powtarzany przy renderowaniu większego interfejsu użytkownika (od ikon w aplikacji Windows GUI do znaków czcionki w edytorze tekstu, tekstur na powierzchniach w grze 3D), sensowne jest załaduj obraz raz do pamięci i po prostu wskaż go za pomocą bardzo prostych obiektów, których wykonanie jest tanie i same nie zajmują dużo pamięci. Duszek, który jest po prostu punktem w przestrzeni graficznej, w którym obraz powinien zostać wyświetlony, jest po prostu punktem 3D i wskaźnikiem pamięci do pierwszego piksela obrazu, który ma zostać użyty. MAYBE obejmuje również wymiary części pliku obrazu duszka, która ma być użyta, pod względem graficznym lub pamięciowym. Ta informacja jest bardzo niedroga do zmiany, powiedzmy, aby zmienić obraz lub lokalizację duszka, i można tego dokonać bez ładowania nowego obrazu za każdym razem, drastycznie zwiększając wydajność bazowego programu do manipulowania i wyświetlania odpowiednich części odpowiednie obrazy do renderowania kompletnej „sceny” interfejsu użytkownika.
źródło
Character
Instancje o zasięgu ASCII w Smalltalk to wagi latające.Kiedy oceniasz coś podobnego
Character space
,Character class >> #value:
wykonuje:Zmienna klasy
CharacterTable
jest inicjowana w następujący sposób:Kiedy więc tworzysz Łańcuch, zakresy ASCII
Character
będą pochodzić,CharacterTable
a nie być nowo tworzone za każdym razem.źródło
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:
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.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.
źródło