Wzorzec Flyweight to wzorzec projektowy stosowany w inżynierii oprogramowania, którego celem jest zmniejszenie zużycia pamięci i poprawa wydajności aplikacji poprzez udostępnianie jak największej ilości danych pomiędzy wieloma obiektami. Ten wzorzec jest szczególnie przydatny w przypadku dużej liczby obiektów o podobnych cechach i gdy indywidualny stan każdego obiektu może być zewnętrzny (można go udostępnić) lub wewnętrzny (nie można udostępnić).
Zalety wzoru muszej:
1. Wydajność pamięci: udostępniając wspólne dane wielu obiektom, wzorzec Flyweight zmniejsza zużycie pamięci, szczególnie w przypadku dużej liczby podobnych obiektów.
2. Poprawa wydajności: udostępnianie danych skraca czas i zmniejsza moc obliczeniową wymaganą do tworzenia obiektów i manipulowania nimi, co prowadzi do poprawy wydajności.
3. Zmniejszona liczba obiektów: wzorzec umożliwia reprezentowanie dużej liczby obiektów przy użyciu mniejszej liczby współdzielonych instancji, co prowadzi do zmniejszenia liczby obiektów i związanego z tym narzutu.
4. Upraszcza kod: wzorzec oddziela stan wewnętrzny i zewnętrzny, co może prowadzić do czystszego i łatwiejszego w utrzymaniu kodu.
5. Elastyczność: wzór Flyweight można łączyć z innymi wzorcami projektowymi, aby ulepszyć ogólną strukturę i funkcjonalność aplikacji.
Scenariusze użycia wzorca muszej:
1. Edytory tekstu: w aplikacji do edytowania tekstu każdy znak w dokumencie może być reprezentowany jako obiekt typu mus. Wizualną reprezentację postaci, czcionkę i rozmiar można udostępniać wielu instancjom tej postaci.
2. Tworzenie gry: w grze obiekty o wadze muszej mogą służyć do reprezentowania cząstek, kul lub innych małych elementów graficznych, które powtarzają się wiele razy.
3. Narzędzia do projektowania graficznego:oprogramowanie graficzne może używać wzoru muszki do zarządzania różnymi pociągnięciami pędzla, kształtami i innymi elementami graficznymi o wspólnych atrybutach.
4. Połączenia z bazą danych: podczas zarządzania połączeniami z bazą danych można zastosować wzorzec muchy, aby ponownie wykorzystać połączenia z tymi samymi poświadczeniami.
Wyobraź sobie, że budujesz platformę mediów społecznościowych, na której użytkownicy mogą przewijać swoje posty zawierające różne posty od swoich znajomych. Każdy post składa się z wiadomości tekstowej, obrazu i nazwy użytkownika osoby, która go opublikowała. Aby zoptymalizować wykorzystanie pamięci i poprawić wydajność, możesz zastosować wzorzec Flyweight.
import java.util.HashMap; import java.util.Map; // Flyweight interface interface Post { void display(); } // Concrete flyweight class class SharedPost implements Post { private String username; private String text; private String imageUrl; public SharedPost(String username, String text, String imageUrl) { this.username = username; this.text = text; this.imageUrl = imageUrl; } public void display() { System.out.println("Username: " + username); System.out.println("Text: " + text); System.out.println("Image URL: " + imageUrl); System.out.println("Displaying post..."); } } // Flyweight factory class PostFactory { private static final Map<String, Post> postMap = new HashMap<>(); public static Post getPost(String username, String text, String imageUrl) { String key = username + "_" + text + "_" + imageUrl; Post post = postMap.get(key); if (post == null) { post = new SharedPost(username, text, imageUrl); postMap.put(key, post); } return post; } } // Client code public class SocialMediaExample { public static void main(String[] args) { String[] usernames = {"user1", "user2", "user3"}; String[] postTexts = {"Hello, world!", "Having a great day!", "Check out this amazing view!"}; String[] imageUrls = {"image1.jpg", "image2.jpg", "image3.jpg"}; for (int i = 0; i < 10; i++) { String username = usernames[i]; String text = postTexts[i]; String imageUrl = imageUrls[i]; Post post = PostFactory.getPost(username, text, imageUrl); post.display(); System.out.println("--------"); } } }
Podsumowując, Flyweight Pattern optymalizuje pamięć i wydajność, udostępniając dane pomiędzy podobnymi obiektami. Zmniejsza nadmiarowość, poprawia wydajność i jest przydatny w scenariuszach z wieloma wystąpieniami wspólnych atrybutów.