Interface FactoryMethod

Obiecte constante (Immutable)


Definitie

Reprezinta o politica de manipulare a obiectelor, prin care se interzice modificarea starii interne a acestora dupa ce ele au fost create.
 

Context

Sablonul Immutable este util in situatiile in care anumite obiecte sunt accesate in comun de mai multe alte obiecte, iar starea celor dintai este mai frecvent consultata decat modificata. In asemenea situatii, problema cea mai serioasa este ridicata de realizarea coordonarii accesului la obiectele partajate, mai ales daca citirea starii si modificarea ei sunt efectuate in mod asincron.
Conform sablonului Immutable, un obiect odata creat nu-si mai modifica starea interna; daca este necesara modificarea starii, atunci se creaza un obiect cu noile valori ale starii.
Exemplu: intr-un program de joc care implica plasarea si uneori miscarea unor piese pe campul de joc, se poate adopta decizia de a folosi obiecte constante pentru a reprezenta pozitia pieselor:

 
 

Se observa ca in clasa Position, pe langa constructor, apar doar metode de acces in citire a starii, precum si o metoda de creare a unei noi instante a clasei, dar nu exista nici o metoda de modificare a starii.

In limbajul Java clasa String este un exemplu de aplicare a sablonului Immutable. Astfel, metode ca toLowerCase sau substring, care determina o secventa de caractere pe baza unui obiect String, returneaza noua secventa intr-un nou obiect String.
 
 

Motivatii

Solutie

Pentru a evita sarcina de a controla propagarea si sincronizarea modificarilor starii unui obiect utilizat in comun de mai multi clienti, se defineste obiectul respectiv ca obiect constant. Aceasta se realizeaza prin includerea in clasa corespunzatoare doar a constructorilor si a metodelor de acces in citire a starii.
 
 

Consecinte

Atunci cand se doreste modificarea starii unui obiect constant, de fapt trebuie creata o noua instanta a clasei repsective, pasand constructorului noile valori de stare.
 

Implementare

La implementare se aplica 2 reguli:

Considerand clasa Position descrisa mai sus, implementarea ei in C++ este:
 
class Position {
    private:
        int x, y;
    public:
        Position(int xx, int yy): x(xx), y(yy) { }
        int getX( ) { return x; }
        int getY( ) { return y; }
        Position offset(int xoff, int yoff) { return *(new Position(x+xoff, y+yoff)); }
};

O  varianta a sablonului Immutable o reprezinta obiectul Read-only, utilizat atunci cand exista cel putin o clasa client care trebuie sa modifice instantele unei clase dupa ce ele au fost create. In acest caz se procedeaza astfel: se defineste o interfata care contine doar metodele de consultare a starii, iar clasele client obisnuite vor accesa obiectul read-only prin intermediul acestei interfete; clasa client care trebuie sa modifice starea obiectului il va accesa direct.
 



Tema
Se cere sa se aplice varianta Read-only Object a sablonului Immutable pentru urmatoarea situatie:

Interface FactoryMethod