Documente online.
Username / Parola inexistente
  Zona de administrare documente. Fisierele tale  
Am uitat parola x Creaza cont nou
  Home Exploreaza
Upload




























Flyweight

Informatica




Flyweight

Proprietati




Tip: Structural

Nivel: Componenta

Scop

Sa reduca numarul de obiecte de nivel jos, foarte detaliate, dintr-un sistem, prin partajarea obiectelor.

Introducere

Programul orientat pe obiecte este o colectie structurata de obiecte care comunica între ele prin mesaje. Daca numarul de obiecte din colectie este mare, si daca acestea sunt de nivel jos, atunci memoria sistemului (a JVM, în cazul când limbajul de programare este Java) este folosita extensiv.

În cazul PIM, multe dintre obiectele existente la un moment dat se pot modifica ( 22122m1212w edita). De regula, ele vor folosi sablonul State pentru a determina când trebuie salvat continutul elementelor lor. La rândul lor, fiecare dintre elemente poate avea propria sa colectie de obiecte State.

O modalitate de rezolvare a problemei gestiunii unui numar mare de obiecte este partajarea acestora. Multe dintre obiectele de nivel jos difera foarte putin unul fata de celalalt, iar majoritatea starii si comportamentului lor sunt aceleasi. Partajarea instantelor reduce dramatic numarul de obiecte care trebuie gestionate la un moment dat, fara a impieta asupra functionalitatii.

Pentru o multime de obiecte, sablonul Flyweight separa acele parti ale obiectelor care sunt aceleasi de partile care difera. Datele care fac diferenta între diversele instante (numite date externalizate) sunt furnizate unei instante generice si unice la nevoie.

Aplicabilitate

sablonul Flyweight se foloseste când sunt îndeplinite toate conditiile de mai jos:

Aplicatia foloseste multe obiecte care sunt identice sau aproape identice.

Pentru toate obiecte aproape identice, partile diferite se pot separa de partile comune (identice) astfel ca partea comuna sa se poata partaja.

Grupurile de obiecte aproape identice se pot înlocui cu un singur obiect partajat dupa ce partile care nu sunt comune au fost scoase din obiect.

Aplicatia are nevoie sa faca deosebirea dintre obiectele aproape identice în starea lor initiala.

Descriere

sablonul Flyweight este dedicat reducerii numarului de obiecte dintr-o aplicatie prin partajarea obiectelor. Obiectele contin anumite date interne, iar toate datele legate de contextul în care obiectele opereaza sunt furnizate de o sursa externa. Fiecare obiect partajat trebuie sa fie cât mai generic cu putinta si independent de contextul în care este folosit

Prin partajarea obiectelor, sablonul Flyweight reduce semnificativ numarul acestora. Obiectul partajat este folosit de mai multi clienti si nu se poate deosebi de un obiect care nu este partajat.

Un exemplu de sablon Flyweight este un gestionar de aspect (layout manager). La construirea unei interfete grafice (GUI), se folosesc mai multe containere. Pentru a determina aspectul, se foloseste un gestionar de aspect. În general, toti gestionarii de aspect sunt aproape identici; ei difera doar prin componentele specifice care le gestioneaza si prin unele atribute setate. Daca componentele si atributele se scot din gestionarul de aspect, atunci toti gestionarii sunt identici. Când este nevoie de functionalitatea managerului, componentele si atributele sunt transmise singurei instante partajate. Daca se dispune de câte un obiect partajat pentru fiecare tip de gestionar de aspect si daca contextul specific îi este transmis numai la nevoie, atunci numarul de obiecte gestionar de aspect necesare se reduce considerabil.

Clientii care folosesc obiectul partajat sunt responsabili pentru furnizarea si/sau calcularea informatiei de context. Informatia este trimisa obiectului partajat când acesta are nevoie de ea.

Obiectul Flyweight este partajat, prin urmare el nu este creat direct de clienti, ci se obtine printr-o fabrica ("Abstract Factory"). O astfel de fabrica asigura partajarea adecvata a obiectelor Flyweight.

Nu neaparat toate obiectele Flyweight trebuie partajate, dupa cum nu toate clasele care le implementeaza trebuie partajate. sablonul Flyweight permite partajarea obiectelor, dar nu impune aceasta folosire în comun a lor.

sablonul Flyweight se foloseste numai când este dificila indentificarea si extragerea datelor din obiecte si când numarul de stari diferite este limitat.


Implementare

Diagrama de clase a sablonului Flyweight este ilustrata în Figura 1

Figura 1. Diagrama de clase a sablonului Flyweight

Pentru implementarea sablonului Flyweight este nevoie de urmatoarele:

Flyweight - Interfata care defineste metodele pe care le pot folosi clientii pentru a transmite stare externa în obiectele Flyweight.

ConcreteFlyweight - Clasa care implementeaza interfata Flyweight, ca si abilitatea de a memora date în interiorul obiectelor sale. Datele interne sunt reprezentative pentru toate locurile în care este nevoie de obiecte Flyweight

FlyweightFactory - Fabrica ce raspunde de crearea si gestionarea obiectelor Flyweight. Accesul clientilor la crearea de obiecte Flyweight printr-o fabrica asigura o partajare adecvata a acestora. Fabrica poate crea toate obiectele la începutul executiei aplicatiei, sau sa astepte pâna este nevoie de ele.

Client - Raspunde de crearea si furnizarea contextului pentru obiectele Flyweight. Singura modalitate de a obtine o referinta la un obiect Flyweight este prin FlyweightFactory

Avantaje si dezavantaje

Avantajul evident al acestui sablon este numarul redus de obiecte care trebuie gestionate. Prin aceasta se face atât economie de memorie, cât si de spatiu pe dispozitivele de memorare, daca obiectele sunt persistente.



Cel mai mult spatiu se economiseste când informatia de context se calculeaza, nu se memoreaza. Desigur, în acest caz executia dureaza mai mult.

În loc sa se memoreze mai multe obiecte, clientii trebuie sa calculeze informatia de context si sa o trimita obiectului Flyweight. Acesta, la rândul sau, va folosi informatia respectiva pentru functii de calcul/furnizare de valori. Daca se gestioneaza mai putine obiecte, ar trebui sa se obtina - în cazul unei implementari corecte - performante mai bune la executie. Daca informatia de context este putina, iar obiectul Flyweight este mare, se obtine o economie semnificativa.

Variatiuni la acest sablon

Nici una.

sabloane înrudite

Abstract Factory - Este folosit pentru a furniza accesul la obiecte Flyweight; aceste fabrici asigura partajarea adecvata a instantelor Flyweight.

Composite - sablonul Composite se foloseste frecvent pentru a oferi structura.

State - sablonul State se implemeneteaza adesea folosing sablonul Flyweight.

Strategy - si sablonul Strategy se poate implementa ca Flyweight.

Exemplu

Exemplul foloseste sablonul Flyweight pentru a partaja obiecte State în PIM. Exemplul de la sablonul State a folosit obiecte State pentru a memora informatia pentru o multime de obiecte Appointment. In examplul de fata, obiectele State se vor folosi pentru a gestiona editarea si salvarea colectilor multiple de obiecte.

Interfata State furnizeaza comportamentul standard pentru toate starile aplicatiei. Ea defineste doua metode de baza, edit si save

Exemplul 1 State.java

1. package flyweight.example;

3. import java.io.File;

4. import java.io.IOException;

5. import java.io.Serializable;

public interface State

Starea este implementata de doua clase - CleanState si DirtyState. Exemplul de mai jos foloseste respectivele clase pentru a pastra starea mai multor obiecte, deci clasele trebuie sa aiba sprijin (comportament) suplimentar pentru a tine minte ce elemente trebuie împrospatate.

Exemplul 2 CleanState.java

1. import java.io.File;

2. import java.io.FileOutputStream;

3. import java.io.IOException;

4. import java.io.ObjectOutputStream;

5. import java.io.Serializable;

7. public class CleanState implements State

public void edit(int type)

Exemplul 3 DirtyState.java

1. package flyweight.example;

3. import java.io.File;

4. import java.io.FileOutputStream;

5. import java.io.IOException;

6. import java.io.ObjectOutputStream;

7. import java.io.Serializable;

9. public class DirtyState implements State

public void edit()

Deoarece aceste doua clase se folosesc pentru a memora starea generala a aplicatiei, ele sunt gestionate de o clasa StateFactory care creaza obiecte din fiecare clasa si le furnizeaza la cerere.

Exemplul 4 StateFactory.java

1. public class StateFactory

public static void setCurrentState(State state)










Document Info


Accesari: 1928
Apreciat:

Comenteaza documentul:

Nu esti inregistrat
Trebuie sa fii utilizator inregistrat pentru a putea comenta


Creaza cont nou

A fost util?

Daca documentul a fost util si crezi ca merita
sa adaugi un link catre el la tine in site

Copiaza codul
in pagina web a site-ului tau.




eCoduri.com - coduri postale, contabile, CAEN sau bancare

Politica de confidentialitate




Copyright © Contact (SCRIGROUP Int. 2022 )