Documente Academic
Documente Profesional
Documente Cultură
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
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
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
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
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
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
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
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