Flyweight Pattern este un model de proiectare în ingineria software care are ca scop reducerea utilizării memoriei și îmbunătățirea performanței unei aplicații prin partajarea cât mai multor date posibil între mai multe obiecte. Acest tipar este deosebit de util atunci când aveți de-a face cu un număr mare de obiecte care au caracteristici similare și unde starea individuală a fiecărui obiect poate fi extrinsecă (poate fi partajată) sau intrinsecă (nu poate fi partajată).

Avantajele modelului Flyweight:

1. Eficiența memoriei:Prin partajarea datelor comune între mai multe obiecte, Flyweight Pattern reduce consumul de memorie, mai ales atunci când aveți de-a face cu un număr mare de obiecte similare.

2. Îmbunătățirea performanței: Partajarea datelor reduce timpul și puterea de procesare necesare pentru a crea și manipula obiecte, ceea ce duce la o performanță îmbunătățită.

3. Număr redus de obiecte: Modelul vă permite să reprezentați un număr mare de obiecte folosind un număr mai mic de instanțe partajate, ceea ce duce la o reducere a numărului de obiecte și a supraîncărcării asociate.

4. Simplifica codul: Modelul separă starea intrinsecă de cea extrinsecă, ceea ce poate duce la un cod mai curat și mai ușor de întreținut.

5. Flexibilitate: Modelul Flyweight poate fi combinat cu alte modele de design pentru a îmbunătăți structura generală și funcționalitatea aplicației.

Scenarii de utilizare pentru modelul Flyweight:

1. Editore de text:Într-o aplicație de editare de text, fiecare caracter dintr-un document poate fi reprezentat ca un obiect cu greutatea muștei. Reprezentarea vizuală, fontul și dimensiunea personajului pot fi partajate între mai multe instanțe ale personajului.

2. Dezvoltarea jocului:Într-un joc, obiectele cu greutatea muștei pot fi folosite pentru a reprezenta particule, gloanțe sau alte elemente grafice mici care se repetă de multe ori.

3. Instrumente de proiectare grafică:Software-ul pentru grafică poate folosi modelul Flyweight pentru a gestiona diferite lovituri de pensulă, forme sau alte elemente grafice cu atribute comune.

4. Conexiuni la baze de date: atunci când gestionați conexiunile la baze de date, modelul flyweight poate fi folosit pentru a reutiliza conexiunile cu aceleași acreditări.

Imaginați-vă că construiți o platformă de socializare în care utilizatorii pot derula prin fluxul lor de postări care conține diverse postări de la prietenii lor. Fiecare postare constă dintr-un mesaj text, o imagine și numele de utilizator al persoanei care a postat-o. Pentru a optimiza utilizarea memoriei și a îmbunătăți performanța, puteți aplica modelul 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("--------");
        }
    }
}

În concluzie, Flyweight Pattern optimizează memoria și performanța prin partajarea datelor între obiecte similare. Reduce redundanța, îmbunătățește eficiența și este utilă pentru scenarii cu multe cazuri de atribute comune.