Flyweight jest strukturalnym wzorcem projektowym, którego zadaniem jest zmniejszenie ilości instancji klas w aplikacji. Jest bardzo zbliżony do Singleton’a i często Singleton jest wykorzystywany we wzorcu Flyweight.
Czasami zdaża się, że potrzebujemy na prawdę wielkiej ilości małych obiektów. Np. rysując zawartość folderu, możemy stworzyć obiekt katalogu lub pliku dla każdego obecnego w systemie. Może to doprowadzić do niepotrzebnego zuzycia zasobów. Te obiekty tak na prawdę nie różnią się wiele, ikonka taka sama tylko nazwa inna.
W takiej sytuacji wykorzystuje się wzorzec Flywieght. Jego zadaniem jest stworzenie jednego obiektu, którego dane są delegowane do innego miejsca. Zamiast tworzyć kilkaset małych obiektów, tworzy się jeden, a jako paramter podaje się to co jest zmienne. Tworzy się jedną instancję dla rodzaju obiektu. Więc np, folder i folder zaznaczony (który ma inną ikonkę) to dwa różne obiekty.

Spójrzmy na przykład:

Potrzebujemy narysować serię przycisków. Stworzyliśmy klasę FlyweightButton, która za pomocą metody draw() rysuje je na ekranie. Przyciski są podobne, różnią sie tylko nazwą więc trzeba będzie ograniczyć liczbę instancji w systemie do minimum. Jako pomocnika napisaliśmy klasę FlyweightButtonManager, która zarządza pulą przycisków. Akurat w każdym rzędzie przycisk ma inną ikonkę więc dla każdego rzędu jest wywoływana nowa instancja klasy. Działanie managera jest podobne do działania singletona. gdy wywoływana jest metoda getFlyweightButton() sprawdza się czy dla danego rzędu FlyweightButton juz instnieje, jeżeli nie – to tworzy się nowy – potem zwraca się go.
zobaczmy:

Dla uwidocznienia w naszym przykładzie umieściłem kod, który drukuje HashCode aby upewnić się, że wszystkie wywołane Buttony są tej samej instancji.

Diagram wzorca:


.