Sunteți pe pagina 1din 54

Ingineria programrii

6. abloane de proiectare
creaionale (II)
Florin Leon
Universitatea Tehnic Gheorghe Asachi din Iai
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
creaionale (II)
1. Singleton
2. Prototip
3. Constructor
4. Concluzii

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

Terminologie

Singleton
Prototype = Prototip
Builder = Constructor ( constructorul unei
clase, fr. Monteur, montator, asamblor)

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

Not

Programele care implementeaz abloanele


descrise i care pot fi descrcate din pagina
cursului sunt parte integrant a prezentrii

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

abloane de proiectare
creaionale (II)
1. Singleton
2. Prototip
3. Constructor
4. Concluzii

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

Singleton

De multe ori este nevoie s garantm faptul ca o clas s aib o


singur instan (sau un numr limitat)
Bazin de resurse (engl. resource pool)

De exemplu: fire de execuie, conexiuni de reea

Registrul Windows
Gestionarea unui set de preferine
Interfa cu sistemul de operare
Drivere pentru dispozitive

De exemplu: imprimant, plac grafic, controller

Depozit de date (engl. data repository)


Un singleton este o clas care poate avea doar o singur
instan

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

Implementarea clasic

Scop: Asigur faptul c o clas are


doar o singur instan i furnizeaz
un punct de acces global ctre aceasta
7

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

Alternative

Variabil global static

Iniializarea ntrziat este util n cazul n


care obiectul folosete multe resurse

Se aloc automat, chiar dac nu va fi folosit

Instana nu se aloc dect n momentul utilizrii


efective

Spre deosebire de varianta static, clasa


Singleton se poate deriva
8

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

Structur
Singleton
- theInstance : Singleton = null
Client

- Singleton()
+ instance() : Singleton

if ( theInstance == null )
theInstance = new Singleton()
return instance

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

Comportament
sd SingletonBehavior
:Client

Singleton:Class

s=instance()
opt

[no instance]
create

s:Singleton

10

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

Multithreading

Dou fire de execuie diferite pot accesa


seciunea simultan i pot instania dou
obiecte

11

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

Abordarea 1

seciune sincronizat
toate citirile se fac dup
blocare iar toate scrierile se
fac nainte de deblocare

performaele scad datorit


blocrii/deblocrii la fiecare acces
Florin Leon, Ingineria programarii, http://florinleon.byethost24.com/curs_ip.htm

12

Abordarea 2

double-checked locking

13

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

Abordarea 2
Modificatorul volatile utilizat
pentru un cmp accesat de mai
multe fire se execuie asigur
faptul c un fir de execuie citete
valoarea cea mai recent a
cmpului, setat de un alt fir de
execuie.

Sistemul citete valoarea curent


a unui obiect volatil n momentul
solicitrii, chiar dac instruciunea
precedent a citit valoarea
aceluiai obiect. De asemenea,
valoarea obiectului este scris
imediat dup atribuire.
14

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

Abordarea 3

detalii n slide-ul urmtor

15

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

Flagul beforefieldinit (I)

16

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

Flagul beforefieldinit (II)

Dac flagul beforefieldinit NU este setat (adic atunci cnd se


definete un constructor static), CLR-ul NU va instania clasa dect
dup ce are loc una din urmtoarele situaii:

Se creeaz o instan a clasei, sau

Este accesat un cmp static sau o metod static a clasei

nainte de a fi accesat un membru static, JIT verific dac constructorul


static a fost apelat mai nti

Scade performana

Note:

CLR = Common Language Runtime (mediul de execuie pentru program)

JIT = Just-In-Time compiler


17

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

Constructorul static

n exemplul de mai jos, dac flag-ul beforefieldinit este


setat, este posibil ca r1 s nu fie iniializat cnd se
apeleaz metodele Method1 i Method2, deoarece
metodele nu acceseaz cmpul r1

n general, se recomand folosirea constructorului static,


pentru a evita defecte subtile, greu de depistat
18

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

Alte probeme

Java

Classloader
Garbage collector

C++

Resursele folosite de un Singleton trebuie dezalocate la


nchiderea aplicaiei
Singleton-ul Meyers definete instana ca o variabil local
static ntr-o funcie, care returneaz o referin la ea
O astfel de definiie invoc destructorul Singleton nainte
de terminarea programului, prevenind scurgerile de
memorie (engl. memory leaks)
19

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

Singleton n C++

GoF: instana este creat cnd


se apeleaz prima dat
funcia, dar nu este distrus

Meyers: instana este creat la fel


dar destructorul se apeleaz
nainte de terminarea programului

20

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

Exemple C#

Cele 4 variante...
Structura...
Load Balancer...

21

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

Cele 4 variante

22

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

Structura

23

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

Load Balancer

24

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

Discuie

Unele abloane sunt implementate folosind un


Singleton

De exemplu, o Fabric Abstract poate utiliza un Singleton


pentru a asigura unicitatea fabricii
Fabricile trebuie s fie accesibile global; prin folosirea unui
Singleton, se asigur faptul c o singur fabric va controla
crearea obiectelor
Aceast abordare este util dac fabrica aloc instanele
de obiecte dintr-un bazin (engl. pool) de obiecte

25

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

abloane de proiectare
creaionale (II)
1. Singleton
2. Prototip
3. Constructor
4. Concluzii

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

Clonarea

O alternativ la instanierea unei clase este


realizarea unei cpii a unui obiect

O clon este o copie a unui obiect

Clona are starea sursei la momentul crerii

27

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

Copii superficiale i profunde

engl. shallow copies, deep copies


La copierea obiectelor care au referine la alte
entiti (de exemplu obiecte) se pune ntrebarea:
trebuie copiate referinele sau entitile refereniate?
Copie superficial: se copie referinele
Copie profund: se copie entitile refereniate i
orice alte entiti refereniate recursiv
Tipul de copiere recomandat depinde de situaie

28

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

Copii superficiale i profunde

29

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

ablonul Prototip

Folosete clonarea, implementat de o metod Clone()

Asemntoare cu Metoda Fabric, dar se returneaz un obiect


de acelai tip, nu un Produs

Utilizeaz interfee pentru a decupla clientul de produsul


clonat

Nu specific dac clonarea este superficial sau


profund

Tipul depinde de problema curent

Ideea de baz: utilizarea unei instane tipice pentru a


crea o instan nrudit
30

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

Structur
Client

prototype

interface
Prototype
clone()

ConcretePrototype1
ConcretePrototype2

31

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

Comportament
sd PrototypeBehavior
:Client

:Prototype

p=clone()

create

p:Prototype

32

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

Exemplu: prototipuri grafice

Se poate construi un editor de note muzicale


particulariznd un editor grafic general

33

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

Template-urile Word

Template-urile sunt prototipuri de documente completate


parial, care urmeaz s fie modificate de utilizator

34

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

Font-uri C#

textBox.Font = new Font(textBox.Font, newStyle);

35

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

Clonare n C#

Clonare superficial

Clonare profund

36

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

Exemple C#

Structura...
Color Manager...
Swimmers...

37

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

Structura

38

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

Color Manager

39

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

Swimmers

40

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

Aplicabilitate

Cnd clienii trebuie decuplai de produse:

Dac clasele care trebuie instaniate sunt specificate n


momentul execuiei (de exemplu ncrcare dinamic)

Pentru a evita construirea unei ierarhii de fabrici paralele


cu ierarhia de produse

Dac instanele unei clase pot avea una sau doar cteva
combinaii distincte de stare

Prototipul este asemntor cu Metoda Fabric, ns


folosete clonarea n loc de instaniere

41

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

Dificulti

Se poate dori iniializarea unor valori dup clonare


Problema principal este legat de tipul clonrii
Clonarea superficial poate afecta datele partajate
n cazul unei clone profunde, toate componentele
clonei trebuie s fie clone ale componentelor
prototipurilor
Clonarea profund este imposibil n cazul
referinelor circulare

42

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

abloane de proiectare
creaionale (II)
1. Singleton
2. Prototip
3. Constructor
4. Concluzii

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

Constructor

Scop: separarea construciei unui obiect


complex de reprezentarea sa astfel nct
acelai proces de construcie s poat crea
reprezentri diferite

44

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

Structur

45

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

Exemple C#

Structura...
Vehicle Builder...
Equities...

46

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

Structura

47

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

Vehicle Builder

48

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

Equities

49

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

Aplicabilitate

Cnd algoritmul de creare a unui obiect complex


este independent de prile care compun
obiectul i de modul lor de asamblare

Cnd procesul de construcie trebuie s permit


reprezentri diferite pentru obiectul construit

ablonul este des folosit n realizarea parserelor


pentru diferite formate

50

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

Discuie (I)

Constructorul creeaz un obiect complex pas cu pas.


Fabrica Abstract creeaz familii de obiecte, cte un
component odat

Produsul este returnat de Constructor ca ultim pas,


Fabrica Abstract returneaz un produs imediat

Constructorul ncapsuleaz logica modului n care este


asamblat un obiect complex, astfel nct clientul poate
doar s cear o configuraie iar Constructorul
direcioneaz logica de construire

Fabrica Abstract este preocupat de CE se realizeaz,


Constructorul este preocupat de CUM se realizeaz
51

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

Discuie (II)

Deseori, proiectarea ncepe cu Metoda Fabric (mai


simpl) i evolueaz ctre alte abloane mai flexibile i
mai complexe (Prototip, Constructor, Fabrica Abstract)

Constructorul poate utiliza alte abloane pentru a


implementa componentele care se construiesc

Constructorul, Fabrica Abstract i Prototipul pot utiliza un


Singleton pentru implementare

Constructorul construiete deseori o Compunere


(engl. Composite, ablon structural)

52

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

abloane nrudite
Un obiect folosit pentru a crea
alte obiecte-produs specifice

Prototip

Produsul este creat


prin copierea i
modificarea unui
obiect prototip

Fabrica
abstract

Obiectul fabric
produse din mai
multe clase

Constructor

Un produs complex
este construit
incremental

53

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

Concluzii

ablonul Singleton garanteaz c dintr-o clas


poate exista numai o singur instan

ablonul Prototip are ca scop clonarea


instanelor de obiecte n momentul execuiei pe
baza unor obiecte prototip

ablonul Constructor abstractizeaz paii de


construire a unui obiect astfel nct diferite
implementri ale acestor pai pot construi
reprezentri diferite ale obiectelor
54

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

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