WZORCE #9 – Pyłek

Cześć.

Kolejnym wzorcem z grupy wzorców strukturalnych, o których mówię już od paru tygodni, będzie Pyłek (ang. Flyweight), którego postaram się dokładnie przedstawić w tym artykule.

Przeznaczenie:

Jego celem jest wyeliminowanie konieczności tworzenia wielu obiektów o identycznych lub bardzo podobnych właściwościach, a co za tym idzie zmniejszenie wykorzystywanej przez program pamięci.

Zastosowanie:

Dobrym przykładem zastosowania tego wzorca jest aplikacja, w której trzeba zasymulować istnienie bardzo dużej grupy ludzi. Są oni najczęściej bardzo podobni do siebie. Załóżmy, że symulujemy rozkład ludzi na jakiejś uproszczonej mapie 2D. Każda osoba ma swój typ (mężczyzna, kobieta lub dziecko) oraz współrzędne położenia na mapie (x i y). W momencie, kiedy zachodzi potrzeba utworzenia np. miliona osób, nie trzeba tworzyć miliona obiektów – tak naprawdę wystarczy stworzyć trzy obiekty – mężczyznę, kobietę oraz dziecko i w razie potrzeby zmieniać ich współrzędne położenia.

Implementacja:

Klasa osoba

public class Person {
    private String type;
    private int x;
    private int y;

    public Person(String type) {
        this.type = type;
    }

    public void show() {
        System.out.println("[Type : " + type + ", x : " + x + ", y : " + y + "]");
    }
}

 

Fabryka osób (w niej znajduje się lista, która przechowuje utworzone obiekty)

public class PersonFactory {
    private static final HashMap<String, Person> personMap = new HashMap();

    public static Person getPerson(String type) {
        Person person = personMap.get(type);
        if (person == null) {
            person = new Person(type);
            personMap.put(type, person);
            System.out.println("Creating person of type : " + type);
        }
        return person;
    }
}

 

Wywołanie programu

    private static final String types[] = { "Man", "Woman", "Child"};

    public static void main(String[] args) {
        for(int i=0; i<10 ; i++) {
            Person person = PersonFactory.getPerson(getRandomType());
            person.setX(getRandomX());
            person.setY(getRandomY());
            person.show();
        }
    }

    private static String getRandomType() {
        return types[(int)(Math.random()*types.length)];
    }
    private static int getRandomX() {
        return (int)(Math.random()*100 );
    }
    private static int getRandomY() {
        return (int)(Math.random()*100);
    }

 

Rezultat

Creating person of type : Woman
[Type : Woman, x : 97, y : 84]
Creating person of type : Man
[Type : Man, x : 78, y : 95]
Creating person of type : Child
[Type : Child, x : 73, y : 41]
[Type : Woman, x : 22, y : 70]
[Type : Child, x : 62, y : 54]
[Type : Man, x : 91, y : 83]
[Type : Woman, x : 36, y : 23]
[Type : Child, x : 42, y : 92]
[Type : Woman, x : 41, y : 72]
[Type : Child, x : 80, y : 6]

Bardzo dobrze widać, że tworzone są tylko trzy osoby typu Person

Diagram klas:


Dziękuje za przeczytanie kolejnego artykułu z tej serii.
Pozdrawiam.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *