Pyłek (ang. Flyweight) (wzorzec strukturalny) minimalizuje wykorzystanie pamięci w procesie tworzenia skomplikowanych obiektów poprzez współdzielenie istniejących referencji do obiektów lub ich elementów. Zamiast tworzyć całkowicie od nowa kolejny egzemplarz wykorzystuje się już istniejące elementy składowe obiektu, które rzadko się zmieniają, a ich stworzenie konsumuje dużo pamięci. Wzorzec ten może przypominać rozbudowany Singleton, jednakże główna różnica polega na tym, że Pyłek zawiera referencję do wielu niezmiennych obiektów różniących się stanem.
Ograniczenia
Ze względu na przeszukiwanie kolekcji istniejących już egzemplarzy oraz wykonanie niezbędnych operacji kontekstu wzrasta zużycie procesora. W przypadku wielu dodatkowych klasy zwiększa się poziom skomplikowania kodu.
Użycie
Wzorca Pyłek stosuje się tam, gdzie zachodzi potrzeba minimalizacji zużycia pamięci RAM w trakcie tworzenia kosztownych obiektów występujących w wielu egzemplarzach, które mogą być sterowane w ten sam sposób.
Implementacja
Klasy, których instancje występują w wielu egzemplarzach implementują lub rozszerzają klasę abstrakcyjną Flyweight. Klasa FlyweightFactory na podstawie przechowywanych niepowtarzających się obiektów, generuje instancje klasy Flyweight.
Poniższy listing przedstawia implementację wzorca Pyłek dla obiektów należących do klasy ConcreteFlyweight.
Klient generuje 100 obiektów typu Flyweight o losowych wartościach. Tworzone obiekty występują w 3 wariantach w związku z czym FlyweightFactory przechowuje referencje tylko do 3 obiektów i na ich bazie tworzy pozostałe.
Przykład
Gra strategiczna Farmer w losowy sposób generuje roślinność na mapie (typ oraz położenie). W związku ze skończoną liczbą wariantów tworzonych roślin i wysokim zużyciem zasobów generowania obiektów graficznych, moduł tworzenia planszy wymaga optymalizacj zużycia pamięci RAM. W tym celu wykorzystuje wzorzec Pyłek.
Klient w pseudolosowy sposób wyznacza rodzaj rośliny oraz punkt w przestrzeni mapy w którym zostanie ona wygenerowana.
Biblioteki
Metody klas osłonowych (ze standardowej biblioteki Java) takie jak np.: Integer.valueOf(int), Boolean.valueOf(boolean) itp. są przykładem realizacji wzorca Pyłek.