Upload
enrollinfo
View
90
Download
4
Embed Size (px)
DESCRIPTION
Sabloane de proiectare creationale
Citation preview
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
5
Ş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
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
6
Ş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
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
7
Terminologie
Simple Factory = Fabrica Simplă
Factory Method = Metoda Fabrică
Abstract Factory = Fabrica Abstractă
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
8
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
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
9
Identificarea aspectelor variabile
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
10
Modificările
Secţiunea variabilă
Secţiunea fixă
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
11
Încapsularea creării obiectelor
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
12
O fabrică simplă
Metoda utilizată de clienţi
pentru instanţierea noilor
obiecte
În loc de string se
recomandă enum
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
13
Utilizarea fabricii
Operatorul new a fost
înlocuit de metoda Create
din fabrică
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
14
Structura Fabricii Simple
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
15
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ă Dar nu se mai poate moşteni metoda Create
Fabrica Simplă nu este un şablon de proiectare, ci un idiom de programare
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
17
Extinderea modelului
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
18
Abstractizarea creării
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
19
Subclasele decid
De fapt, utilizatorul
decide efectiv!
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
20
Exemplu de subclasă
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
21
Declararea unei metode fabrică
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
22
Exemplu de apel (I)
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
23
Exemplu de apel (II)
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
24
Implementarea (I)
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
25
Implementarea (II)
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
27
Şablonul Metoda Fabrică
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
28
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
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
31
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
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
32
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.
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
34
Dependenţele dintre clase
PizzaStore depinde de
toate clasele concrete
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
35
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
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)
abstracţiune
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
36
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 clasa concretă string
se foloseşte pe scară largă)
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
38
Familii de produse
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
39
Fabrica de produse
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
40
Specificarea unei fabrici
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
41
O familie de produse
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
42
O fabrică concretă
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
43
Schema conceptuală
defineşte
interfaţa
asigură
implementarea
produselor
utilizarea
produselor
create de
fabrica
concretă
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
44
Exemplu de apel (I)
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
45
Exemplu de apel (II)
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
47
Structura exemplului prezentat
+ Pizza
care interacţionează cu
ingredientele
Clasele Pizza sunt
“Factory object consumers”
(„Beneficiari”)
Clasa abstractă Pizza este
„Beneficiar abstract” iar
clasele derivate sunt
„Beneficiari concreţi”
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
48
Definiţie
Şablonul Fabrica Abstractă asigură o
interfaţă pentru crearea unor familii de
obiecte înrudite sau dependente fără a le
specifica clasele concrete
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
50
Alte exemple (I)
Structură
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
51
Alte exemple (II)
Caz concret
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
52
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.)
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
53
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
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
54
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
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
56
Fabrica Abstractă
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
57
Concluzii
Metoda Fabrică
Deleagă crearea obiectelor către subclase
Codul de creare nu trebuie să cunoască subclasele
specifice
Fabrica Abstractă
Se poate alege ce familie de produse se creează în
momentul execuţiei
Izolează implementarea de clienţi, deoarece clienţii
utilizează doar interfeţe
Simplifică interschimbarea familiilor de produse
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm
58
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
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm