Sunteți pe pagina 1din 16

1 edited by gl 53 ban

Sablonul Factory: o clas simpl pentru luarea unei decizii-


ntoarce una din mai multe subclase posibile ale unei clase, n
funcie de datele pe care le primete.
Scop
Definete o interfa pentru crearea unui obiect, dar las
subclasele s decid ce clas s instanieze.
Metoda Factory permite unei clase s defere instanierea
subclaselor. Mai este cunoscut i ca Constructor Virtual

Aplicabilitate
O clas nu poate anticipa clasa obiectelor pe care trebuie
s le creeze
O clas dorete ca subclasele sale s specifice obiectele
pe care le creeaz
Clasele deleg responsibilitatea uneia sau mai multor
subclase ajuttoare




2 edited by gl 53 ban

Structura

Consecinte
Elimin legarea ntre clasele specifice aplicaiei din cod
codul de creare folosete doar interfaa clasei Product
Faciliteaz derivarea
subclasele pot astfel modifica produsul creat
Poate conecta ierarhii paralele de clase
las clienii s apeleze FM
Sablonul Abstract Factory: o interfa pentru crearea i
returnarea uneia dintre mai multe familii de obiecte relaionate
Scop
Ofer o interfa pentru crearea de familii de obiecte
familii de obiecte nrudite sau dependente fr
specificarea claselor lor concrete
Aplicabilitate
Sistemul trebuie s fie independent de cum sunt create,
compuse i reprezentate produsele sale
Sistemul trebuie configurat de una din mai multe familii de
produse

3 edited by gl 53 ban

Trebuie forat ca o familie de obiecte produs s fie
folosite mpreun
Structura

Consecinte
Izolarea claselor concrete
apar n ConcreteFactories nu n codul clientului
Faciliteaz schimbul de familii de produse
un ConcreteFactory apare ntr-un singur loc
uor de modificat
Promoveaz consistena ntre produse
toate produsele unei familii se modific mpreun, n
acelai timp
Este dificil susinerea de tipuri noi de produse
necesit o modificare n interfaa AbstractFactory

4 edited by gl 53 ban

... i a tuturor subclaselor sale, n consecin
Exemplu
abstract class WidgetFactory {
public Window createWindow();
public Menu createMenu();
public Button createButton();
}
class MacWidgetFactory extends WidgetFactory
{
public Window createWindow()
{ return new MacWidow() }
public Menu createMenu()
{ return new MacMenu() }
public Button createButton()
{ return new MacButton() }
}

Sablonul Prototype: ncepe cu o clas instaniat i alizat i
o copiaz/ cloneaz pentru a crea instane noi (n loc s creeze
efectiv alte instane)
Scop
Specificai tipul obiectelor care se creeaz folosind o
instan prototipic
Creai obiecte noi copiind acest prototip
Aplicabilitate
cnd un sistem trebuie s fie independent de cum sunt
create, compuse i reprezentate produsele sale i
cnd clasele de instaniat sunt specificate la execuie
evitai construirea unei ierarhii de clase-factory paralel cu
ierarhia claselor de produse

5 edited by gl 53 ban

Consecinte
Adugarea i tergerea produselor la execuie
Mai puin derivare
evit ierarhia paralel pentru creatori
Specificarea de obiecte noi prin varierea valorilor
prototipurilor
clientul se comport diferit prin delegarea ctre
prototip
Specificarea de obiecte noi prin varierea structurii
prototipurilor
produse compuse
Fiecare subclas a Prototype trebuie s implementeze
clone
dificil cnd clasele exist deja sau
obiectele interne nu permit copierea sau au referine
circulare
Exemplu:
class Prototype {
public Prototype clone() {
// code to make a copy of current
Prototype object
return clone;
}
// add what ever else you want the class
to do
}
class ProtoExtension extends Prototype {
public Prototype clone() {
// code to make a copy of current
Protoplasm object
return clone;
} // add more other stuff }

6 edited by gl 53 ban

ClientCodeMethod( Prototype example ) {
Prototype myCopy = example.clone();
// do some work using myCopy
}
Sablonul Singleton:
Este o clas din care nu poate exista mai mult de o instan;
furnizeaz un punct de acces global la aceast instan
Scop
Asigur ca o clas s aib doar o singur instan i
furnizeaz un punct de acces global la ea
Aplicabilitate
dorim exact o instan a unei clase
accesibilitate pentru clieni dintr-un singur punct
dorim ca instana s fie extensibil
poate permite deasemenea i un set numrabil de instane
optimizare fa de vizibilitatea global
mai bine dect o clas static:
nu se poate rzgndi
metode niciodat virtuale
Structura


7 edited by gl 53 ban

Consecinte
Acces controlat la instana unic
Permite rafinarea operaiilor i reprezentrii
Permite un numr variabil (dar precis) de instane
Reducerea vizibilitii globale

Sablonul Command
Scop
ncapsuleaz cereri ca obiecte, i permite:
parametrizarea clienilor cu diferite cereri
nlnuirea sau log-area cererilor
suport pentru operaii anulabile (UNDO)
Aplicabilitate
Parametrizarea obiectelor
Specificarea, nlnuirea, i executarea cererilor la diferite
momente
Suport undo
Modelarea tranzaciilor
structurarea sistemelor construite pe operaii
primitive, n jurul operaiilor de nivel nalt
interfaa comun invocarea identic a tuturor tranzaciilor
Sablonul
public interface Command {
public void Execute();
}
Scop- reducerea actionPerformed la:
public void actionPerformed(ActionEvent e) {
Command cmd = (Command)e.getSource();
cmd.Execute();
}

8 edited by gl 53 ban

Exwmplu
abstract class Command {
abstract public void execute();
}
class OpenCommand extends Command {
private Application opener;
public OpenCommand(Application theOpener) {
opener = theOpener;
}
public void execute() {
String documentName = AskUserSomeHow();
if(name != null) {
Document toOpen = new Document(
documentName );
opener.add( toOpen );
opener.open();
}
}
}
class Menu {
private Hashtable menuActions = new
Hashtable();
public void addMenuItem( String displayString,
Command itemAction )
{
menuActions.put (displayString, itemAction);
}
public void handleEvent( String itemSelected )
{
Command runMe;
runMe = (Command) menuActions.get(
itemSelected );
runMe.execute();
}
}

9 edited by gl 53 ban

Sablonul Composite
Scop
Trateaz obiectele individuale i compunerile acestor
obiecte uniform
Compune obiectele n structuri arborescente pentru a
reprezenta agregri recursive

Aplicabilitate
reprezentarea ierarhiilor de obiecte de tip parte-ntreg
abilitatea de a ignora diferena dintre compuneri de
obiecte i obiecte individuale

Consecinte
Definete ierarhii uniforme de clase
compunere recursiv de obiecte
Face clienii simpli
nu trebuie s tie dac este o frunz sau un compus
simplific codul deoarece evit tratarea diferit a fiecrei
clase
Mai uor de extins
uor de adugat noi clase Composite sau Leave
aplicaie fericit a Principiului Deschis-nchis
Design prea general
sunt necesare verificri de tip pentru a restriciona tipurile
admise ntr-o anumit structur compus






10 edited by gl 53 ban

Exemplu
class Window {
GUIWidgets[] myWidgets;
WidgetContainer[] myContainers;

public void update() {
if(myWidgets != null)
for (int k = 0; k < myWidgets.length();
k++)
myWidgets[k].update();
if(myContainers != null)
for (int k = 0; k <
myContainers.length(); k++)
myContainers[k].updateElements();
// .. .. etc.
}
}

Sablonul Strategy
Scop
Definete o familie de algoritmi, ncapsuleaz fiecare
algoritm, i face interschimbabili
Permite algoritmului s varieze independent de clienii
ce l folosesc
Aplicabilitate
Sunt necesare variante diferite ale unui algoritm
Un algoritm folosete date despre care clienii nu
trebuie s tie
evit expunerea structurilor de date complexe,
specifice algoritmului
Multe clase relaionate difer doar prin comportament
configureaz o clas cu un comportament
particular

11 edited by gl 53 ban

Structura

Participanti
Strategy
declar o interfa comun tuturor algoritmilor.
Context folosete aceast interfa pentru a apela
algoritmul definit de o clas ConcreteStrategy
ConcreteStrategy
implementeaz algoritmul folosind interfaa Strategy
Context
configurat cu un obiect ConcreteStrategy
poate defini o interfa ce permite obiectelor Strategy
s i acceseze datele
Sablonul State
Scop
permite unui obiect s i modifice comportamentul
cnd i se modific starea intern
obiectul va prea c i schimb clasa
Aplicabilitate
comportamentul obiectului depinde de starea sa

12 edited by gl 53 ban

trebuie s i modifice comportamentul la execuie n
funcie de stare
operaii cu instruciuni condiionale multiple, depinznd
de starea obiectului
- starea reprezentat de una sau mai multe constante enumerate
- mai multe operaii cu aceeai structur condiional
Structura

Decorator
Modificarea comportamentului obiectelor individuale fr s
creeze o clas derivat nou
Acesta este un alt caz n care este favorizat relaia de
coninere asupra motenirii
Decoratorul este un obiect grafic, dar conine obiectul pe
care l decoreaz
Poate apela metode grafice, poate executa calcule
adiionale, i le poate trimite ctre obiectul coninut i
decorat
public Decorator(J Component c) {
setLayout(new BorderLayout());
//adaug componenta la container
add("Center", c);}
}

13 edited by gl 53 ban

Principiul deschis-nchis (PDI)
Entitile software trebuie s fie deschise la extinderi, dar
nchise la modificri, citat de R.Martin
- Deschidere la extinderi
Comportamentul modulului poate fi extins
- nchidere la modificri
Codul surs al modulului nu trebuie modificat
- Modulele trebuie scrise astfel nct s poat s fie extinse fr
s fie modificate
Nici un program semnificativ nu poate fi 100% nchis. R.
Martin, Principiul Deschis- Inchis, 1996
- nchidere strategic, nu complet
- nchiderea se obine prin utilizarea abstractizrii
- Construii metode ce pot fi invocate dinamic
Pentru a determina deciziile strategiei generale
Ex. Desenare de ptrate nainte de cercuri
- Utilizai o abordare condus de date pentru a obine nchiderea
- Plasai deciziile strategiei particulare ntr-o locaie separat
Ex. Fiier sau obiect separat
- Minimizeaz localizrile schimbrilor viitoare

Euristici PDI
Modificrile datelor publice aduc un risc de deschidere a
modulului
Pot provoca un efect de modificri n cascad, n mai
multe locaii neateptate;
Erorile pot fi dificil de corectat/ de gsit n totalitate
Corecturile pot introduce erori n alte pri
Membrii non-privai sunt modificabili
Pot schimba starea clasei

14 edited by gl 53 ban

Principiul Substituiei (Liskov)- PSL
Prin motenire, orice proprietate adevrat despre obiectele
supertipului trebuie s rmn adevrat despre obiectele
subtipului. B.Liskov, 1987
Funciile ce folosesc pointeri/ referine la clasele de baz
trebuie s poat folosi obiecte ale claselor derivate fr s
tie aceasta. R.Martin, 1996

PSL- Euristici
Este ilegal ca o clas derivat s suprascrie o metod a clasei
de baz printr-o metod NOP
NOP (no-operation): o metod care nu face nimic
Soluia 1: relaie de derivare invers
Dac n clasa de baz iniial exist doar
comportament adiional
Ex. Cel- cel_care_nu_se_mic
Soluia 2: extragerea unei clase de baz comune
Dac att clasa iniial ct i clasele derivate au
comportamente diferite
Pentru Pinguini: Psri, PsriZburtoare, Pinguini
Clase cu o stare defect:
Ex. Cei stupizi sau paralizai

Principiul Inversrii Dependenelor (PID)
I. Modulele de nivel-nalt nu trebuie s depind de modulele
de nivel sczut. Ambele trebuie s depind de
abstraciuni.
II. Abstraciunile nu trebuie s depind de detalii. Detaliile
trebuie s depind de abstraciuni.

15 edited by gl 53 ban

III. O clas de baz ntr-o ierarhie nu trebuie s i tie
subclasele
IV. Modulele cu implementri detaliate depind de abstraciuni,
i nimic nu depinde de ele
V. PDI= Scopul, PID= mecanismul
VI. PSL=asigurarea pentru PID

Euristici PID
Proiectai centrat pe interfee,nu pe implementare
Utilizai motenirea pentru a evita legarea direct de clase:


Principii fundamentale
Cele trei principii sunt strns relaionate
nclcarea PSL sau PID duce inevitabil la nclcarea PDI
Principiile sunt eseniale pentru a profita de avantajele
dezvoltrii OO







16 edited by gl 53 ban

Sablonul Factory..1
Sablonul Abstract Factory.2
Sablonul Prototype..4
Sablonul Singleton..6
Sablonul Command..7
Sablonul Composite.9
Sablonul Strategy..10
Sablonul State..............................................................11
Decorator..12
Principiul deschis-nchis (PDI)13
Principiul Inversrii Dependenelor (PID).14

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