Pyłek (wzorzec projektowy)

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacja, szukaj

Pyłek (ang. Flyweight) – strukturalny wzorzec projektowy, którego celem jest zmniejszenie wykorzystania pamięci poprzez poprawę efektywności obsługi dużych obiektów zbudowanych z wielu mniejszych elementów poprzez współdzielenie wspólnych małych elementów[1]. Należy do grupy wzorców skatalogowanych przez Bandę Czworga.

Przykładowe zastosowanie[edytuj]

Wzorzec Pyłek stosuje się tam, gdzie klasa ma wiele egzemplarzy, a każdy z tych egzemplarzy może być sterowany w ten sam sposób. Przykład zastosowania można znaleźć w aplikacji wspomagającej modelowanie przestrzennego terenu. W takim muszą się znaleźć obiekty reprezentujące drzewa. Nawet jeśli te obiekty będą bardzo proste (np. będą zawierać tylko wysokość i współrzędne położenia drzewa), to przy modelowaniu wielkich kompleksów zieleni, gdzie będzie potrzeba wielu takich obiektów, aplikacja zacznie działać bardzo wolno. Dlatego w tego typu aplikacjach stosuje się wzorzec Pyłek i zamiast tworzyć wiele egzemplarzy drzew, tworzy się jeden obiekt, który przechowuje stany (współrzędne, wysokość) wszystkich drzew w tablicy.

Struktura wzorca[edytuj]

Istotą wzorca jest podział danych przechowywanych w ciężkim obiekcie na wewnętrzne i zewnętrzne. Do klasy danych wewnętrznych wybierane są te składowe ciężkiej klasy pierwotnej, których wartości często się powtarzają. Pozostałe składowe stanowią dane zewnętrzne. Po ustaleniu podziału zamiast ciężkich obiektów wzorzec wprowadza odpowiadające im obiekty klientów oraz tzw. obiekty pyłków. Obiekty pyłków są tworzone z wybranych wcześniej danych wewnętrznych. Każdy z nich jest współdzielony przez wielu klientów i nie można go modyfikować. Dane zewnętrzne, unikatowe dla każdego obiektu klienta, są dostarczane obiektowi pyłku poprzez określone metody. Wzorzec zawiera dwóch uczestników - Fabrykę Pyłków i Pyłek. Klient nie tworzy egzemplarzy typu Pyłek samodzielnie, a jedynie wysyła do Fabryki żądanie ich udostępnienia. Fabryka zwraca Klientowi istniejący Pyłek lub tworzy nowy, jeśli żaden egzemplarz tej klasy jeszcze nie istnieje.

Innymi słowy[edytuj]

Ideą wzorca projektowego pyłek jest stworzenie prostego mechanizmu współdzielenia wielu obiektów o niewielkim rozmiarze w celu zwiększenia wydajności systemu pod względem zużycia pamięci. Zamiast zapisywać oddzielnie kilka olbrzymich obiektów, dzielmy owe obiekty na mniejsze składowe i elementy które się w nich powtarzają zapisujemy tylko raz,a nie kilka razy. Mówiąc inaczej pyłek ma na celu udostępnianie pojedynczego małego obiektu wielu klientom(dużym obiektom). Implementując ten wzorzec projektowy należy rozwiązać problem wspólnego dostępu do współdzielonych danych. Jednym ze sposobów realizacji tego mechanizmu jest podział danych przechowywanych w atrybutach obiektów (te mniejsze elementy) na współdzielone dane wewnętrzne intrinsicState oraz niewspółdzielone, unikatowe dla każdego obiektu dane zewnętrzne allState. Czyli dwie grupy złożone z małych elementów.

Wzorzec ten można formalnie zrealizować za pomocą czterech głównych elementów:

  • Elementu abstrakcyjnego Flyweight definiującego operacje służące do przyjmowania i odtwarzania stanu zewnętrznego obiektu opisywanego przez klasę UnsharedConcreteFlyweight.
  • Obiektu tworzonego na bazie klasy ConcreteFlyweight przechowujący stan wewnętrzny (współdzielony) obiektu i jest niezależny od kontekstu wywołania.
  • Fabryki FlyweightFactory, której zadaniem jest kreowanie i składowanie obiektów realizujących interfejs Flyweight.

Konsekwencje stosowania[edytuj]

Korzyści wynikające z zastosowania tego wzorca to:

  • ograniczenie liczby obiektów używanych w trakcie wykonywania programu, a co za tym idzie zaoszczędzenie pamięci aplikacji – tym większe, im więcej obiektów jest współdzielonych
  • składowanie danych stanu współdzielonych obiektów odbywa się w jednej lokalizacji.

Wady wzorca Pyłek to:

  • zmniejszenie wydajności aplikacji[2]
  • utrata przez pojedyncze, logiczne egzemplarze klasy możliwości posiadania zachowań niezależnych od pozostałych egzemplarzy.


Podobne wzorce[edytuj]

  • Kompozyt jest często używany wraz z Pyłkiem, by zaimplementować współdzielone liście w strukturze drzewa
  • Pyłek objaśnia czy i w jakich warunkach obiekt typu Stan może być współdzielony
  • Podczas gdy Pyłek pokazuje, jak utworzyć mnóstwo małych obiektów składających się na jeden, lub kilka(-nascie, -dziesiąt) większych, Fasada pokazuje jak utworzyć jeden obiekt reprezentujący cały złożony podsystem.

Przypisy

  1. Opis wzorca na stronie SourceMaking.com.
  2. Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides: Inżynieria oprogramowania: Wzorce projektowe (Wyd. II). Warszawa: Wydawnictwo Naukowo-Techniczne, 2008, s. 235-248. ISBN 978-83-204-3472-9.

Bibliografia[edytuj]

  1. Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides: Inżynieria oprogramowania: Wzorce projektowe (Wyd. II). Warszawa: Wydawnictwo Naukowo-Techniczne, 2008, s. 235-248. ISBN 978-83-204-3472-9.
  2. Eric Freeman, Elisabeth Freeman, Kathy Sierra, Bert Bates: Head First. Design patterns. Helion, 2005, s. 636-637. ISBN 83-7631-792-2.
  3. Skrypty akademickie - "Podstawy UML oraz wzorce projekotwe" - Andrzej Daniluk. UMCS. Lublin, 2014 r.

Linki zewnętrzne[edytuj]