Sunteți pe pagina 1din 60

Ingineria programării

5. Şabloane de proiectare
creaţionale (I)

Florin Leon
Universitatea Tehnică „Gheorghe Asachi” din Iaşi
Facultatea de Automatică şi Calculatoare

http://florinleon.byethost24.com/curs_ip.htm

Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm


Şabloane de proiectare
creaţionale (I)
1. Fabrica Simplă
2. Metoda Fabrică
3. Principiul Inversiunii Dependenţei
4. Fabrica Abstractă
5. Concluzii

Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm


Notă
 Programele care implementează şabloanele
descrise şi care pot fi descărcate din pagina
cursului sunt parte integrantă a prezentării

3
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Şabloane de proiectare
creaţionale (I)
1. Fabrica Simplă
2. Metoda Fabrică
3. Principiul Inversiunii Dependenţei
4. Fabrica Abstractă
5. Concluzii

Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm


Şabloanele creaţionale (I)
 Şabloane de proiectare care tratează mecanismele
de creare a obiectelor
 Obiectele pot fi create într-o manieră adaptabilă la diverse
situaţii
 Fac sistemul independent de modul în care
obiectele sunt create, compuse şi reprezentate
 Încapsulează cunoştinţele privind clasele concrete pe care
le utilizează sistemul
 Ascund modul în care instanţele acestor clase sunt create
şi compuse

5
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Şabloanele creaţionale (II)
 Devin importante când evoluţia unui sistem se
bazează mai mult pe compunere decât pe moştenire
 În locul unei ierarhii prestabilite, elementele unei mulţimi mici
de comportamente fundamentale pot fi combinate în orice
număr de comportamente mai complexe
 Pot introduce constrângeri asupra următoarelor
situaţii:
 cine poate crea obiecte

 cum sunt create obiectele

 când sunt create obiectele

6
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Terminologie
 Simple Factory = Fabrica Simplă
 Factory Method = Metoda Fabrică
 Abstract Factory = Fabrica Abstractă

7
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Instanţierea
 new = concret

 Schimbări?
 Cod deschis pentru extensii dar închis pentru modificări
 Codul scris pentru o interfaţă funcţionează cu orice
implementare
8
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Identificarea aspectelor variabile

9
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Modificările

Secţiunea variabilă

Secţiunea fixă

10
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Încapsularea creării obiectelor

11
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
O fabrică simplă
Metoda utilizată de clienţi
pentru instanţierea noilor
obiecte
În loc de string se
recomandă enum

12
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Utilizarea fabricii

Operatorul new a fost


înlocuit de metoda Create
din fabrică

13
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Structura Fabricii Simple

14
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Discuţie
 Fabrica Simplă este utilă deoarece pot exista
mai mulţi clienţi, de exemplu clasele:
 PizzaShopMenu
 HomeDelivery etc.
 Fabrica Simplă poate fi definită şi ca metodă
statică
 Apel mai simplu
 Dar nu se mai poate moşteni metoda Create
 Fabrica Simplă nu este un şablon de proiectare,
ci un idiom de programare
15
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Şabloane de proiectare
creaţionale (I)
1. Fabrica Simplă
2. Metoda Fabrică
3. Principiul Inversiunii Dependenţei
4. Fabrica Abstractă
5. Concluzii

Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm


Extinderea modelului

17
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Abstractizarea creării

18
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Subclasele decid

De fapt, utilizatorul
decide efectiv!

19
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Exemplu de subclasă

20
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Declararea unei metode fabrică

21
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Exemplu de apel (I)

22
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Exemplu de apel (II)

23
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Implementarea (I)

24
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Implementarea (II)

25
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Rezultate

26
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Şablonul Metoda Fabrică

27
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Definiţie
 Şablonul Metoda Fabrică defineşte o
interfaţă pentru crearea unui obiect, dar lasă
subclasele să decidă ce clasă să instanţieze
 Permite unei clase să cedeze subclaselor
instanţierea de obiecte

28
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Diagrama UML

29
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Alt exemplu

30
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Utilizare
 Metoda Fabrică se foloseşte când:
 O clasă nu poate anticipa din ce clasă trebuie să
creeze un obiect
 O clasă doreşte ca specificarea clasei obiectului
creat să fie făcută de subclasele ei
 Informaţiile despre delegare trebuie localizate

31
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Discuţie
 Fabrica Simplă are o singură implementare,
Metoda Fabrică este o platformă care lasă
subclasele să decidă ce implementare se va
utiliza
 Metoda Fabrică este mai flexibilă, tipurile de produse
pot varia
 Există Metode Fabrică parametrizate (ca mai
sus) şi neparametrizate
 Pentru valorile parametrilor, în loc de string-uri, se pot
folosi: enumerări, constante etc.
32
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Discuţie
 Apelul unor metode
abstracte din constructorul
unei clase de bază abstracte
poate conduce la folosirea
unor câmpuri neiniţializate

33
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Şabloane de proiectare
creaţionale (I)
1. Fabrica Simplă
2. Metoda Fabrică
3. Principiul Inversiunii Dependenţei
4. Fabrica Abstractă
5. Concluzii

Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm


Dependenţele dintre clase

PizzaStore depinde de
toate clasele concrete
35
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Principiul
Inversiunii Dependenţei
 Depindeţi de abstracţiuni,
nu de concretizări
 Atât la nivel înalt,
cât şi la nivel scăzut abstracţiune
 Componentele de nivel
înalt nu trebuie să depindă
de componentele de nivel
scăzut
 Ambele niveluri trebuie să
depindă de abstracţiuni
 De exemplu
şi creatorii (nivel înalt) şi
produsele (nivel scăzut)
36
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Recomandări
 Pentru evitarea violării principiului, se recomandă următoarele:
 Nicio variabilă să nu aibă o referinţă către o clasă concretă
(new – concret, fabrică – abstract)
 Nicio clasă să nu fie derivată dintr-o clasă concretă
 Nicio metodă să nu suprascrie (override) o metodă implementată
a clasei de bază
 Este o interdicţie semantică, nu sintactică: funcţionalitatea suprascrisă
nu trebuie să înlocuiască funcţionalitatea din clasa de bază, doar să
adauge ceva
 Este posibilă respectarea tuturor acestor recomandări întotdeauna?
Probabil că nu.
 Depinde de stabilitatea claselor (de exemplu tipurile primitive sunt clase
concrete, dar se folosesc întotdeauna)
37
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Şabloane de proiectare
creaţionale (I)
1. Fabrica Simplă
2. Metoda Fabrică
3. Principiul Inversiunii Dependenţei
4. Fabrica Abstractă
5. Concluzii

Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm


Familii de produse

39
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Fabrica de produse

40
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Specificarea unei fabrici

41
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
O familie de produse

42
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
O fabrică concretă

43
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Schema conceptuală
defineşte
interfaţa

asigură
implementarea
produselor

utilizarea
produselor
create de
fabrica
concretă 44
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Exemplu de apel (I)

45
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Exemplu de apel (II)

46
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Rezultate

47
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Structura
exemplului
prezentat

48
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Structura exemplului prezentat
 Clasele Pizza sunt “Factory object consumers”
(„Beneficiari”)
 Clasa abstractă Pizza este „Beneficiar abstract”
iar clasele derivate sunt „Beneficiari concreţi”

49
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Definiţie
 Şablonul Fabrica Abstractă asigură o
interfaţă pentru crearea unor familii de
obiecte înrudite sau dependente fără a le
specifica clasele concrete

50
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Diagrama UML

51
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Alte exemple (I)
 Structură

52
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Alte exemple (II)
 Caz concret

53
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Utilizări cunoscute
 Interfeţe grafice cu utilizatorul cu diferite
aspecte “look-and-feel”
 Creatorii: tipurile de interfeţe (Windows Classic,
Windows XP, X Windows etc.)
 Produsele: elementele grafice (meniuri, butoane
etc.)

54
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Aplicabilitate
 Fabrica Abstractă se foloseşte când:
 Sistemul trebuie să fie independent de modul în
care îi sunt create, compuse sau reprezentate
produsele
 Sistemul trebuie configurat cu una din mai multe
familii de produse
 Se doreşte furnizarea unei biblioteci de produse
şi prezentarea doar a interfeţelor, nu şi a
implementărilor acestora

55
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Discuţie
 Ambele şabloane creează obiecte, dar:
 Metoda Fabrică foloseşte moştenirea
 Se derivează clasa şi se implementează metoda abstractă
 Fabrica Abstractă foloseşte compunerea
 Subclasele arată cum se produc produsele
 Pentru utilizarea unei fabrici, aceasta se instanţiază
 În Fabrica Abstractă, adăugarea unui produs necesită schimbarea
interfeţei fabricii (implicit schimbarea tuturor subclaselor)
 Metoda Fabrică creează un singur tip de produs
 Fabrica Abstractă creează familii de produse, deci are nevoie de o
interfaţă mai complexă
 Produsele înrudite sunt grupate
 Clienţii sunt decuplaţi de clasele concrete
56
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Metoda Fabrică
57
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Fabrica Abstractă
58
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Concluzii
 Metoda Fabrică
 Deleagă crearea obiectelor către subclase
 Codul de creare nu trebuie să cunoască subclasele
specifice
 Fabrica Abstractă
 Se poate alege în timpul execuţiei familia de produse
care trebuie creată
 Izolează implementarea de clienţi, deoarece clienţii
utilizează doar interfeţe
 Simplifică interschimbarea familiilor de produse
59
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
Referinţe
 Majoritatea imaginilor şi secvenţelor de cod din
acest curs au fost preluate din următoarele surse:
 Freeman, E., Freeman, E., Bates, B., Sierra, K. (2004).
Head First Design Patterns, O’Reilly Media, Inc.
 http://www.msquaredweb.com/DesignPatterns/
HeadFirstDesignPatternsInCSharp.zip
 Data & Object Factory. Design Patterns
 http://www.dofactory.com/Patterns/Patterns.aspx

60
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm

S-ar putea să vă placă și