58
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

Ingineria programarii: Sabloane de proiectare creationale 1

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

26

Rezultate

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

29

Diagrama UML

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

30

Alt exemplu

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

46

Rezultate

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

49

Diagrama UML

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

55

Metoda Fabrică

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