Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Alfredo Milani
Dipartimento di Matematica e Informatica
Università degli Studi di Perugia
Classificazione dei pattern
Strutturali Creazionali Comportamentali
1. Adapter 8. Factory 13. Template Method
(Adattatore) Method (Metodo sagoma)
2. Façade (Metodo 14. Strategy (Strategia)
(Facciata) fabbrica) 15. State (Stato)
3. Composite 9. Abstract
16. Command (Comando)
(Composto) Factory
(Fabbrica 17. Observer (Osservatore)
4. Decorator 18. Mediator (Mediatore)
(Decoratore) astratta)
10. Singleton 19. Memento (Memento,
5. Bridge Ricordo)
(Ponte) (Singoletto)
11. Prototype 20. Iterator (Iteratore)
6. Proxy
(Proxy) (Prototipo) 21. Visitor (Visitatore)
12. Builder 22. Chain of Responsibility
7. Flyweight
(Peso piuma) (Costruttore) (Catena di responsabilità)
© A. Milani - Design pattern
23. Interpreter (Interprete) 2
Sommario
8. Factory Method
9. Abstract Factory
10. Singleton
11. Prototype
Scopo
Delegare l’istanziazione di una classe a una
propria sottoclasse
La(e) sottoclasse(i) decide(ono) quale istanza
creare, quale costruttore chiamare
Usato tipicamente nei Framework OO
Insieme di classi
Differenza da “libreria” software:
Libreria: il programmatore di un’applicazione
chiama i metodi
FW: il programmatore di un’applicazione
scrive metodi che vengono chiamati dai metodi del FW
“riempie i buchi”
“Hollywood principle”: don’t call us, we’ll call you
Esempi:
Gestione eventi AWT/Swing, applet, servlet, …
© A. Milani - Design pattern 6
Problema tipico in un FW
C -x A
m ->
... + m() + servizio()
A x;
...
x = new ??(); <<istantiates>>
FW x.servizio();
B
+ servizio()
App
C
-x A
+ m()
+ servizio()
# factoryMethod() : A
m ->
FW ...
A x; C1 B
...
<<istantiates>>
x = factoryMethod(); # factoryMethod() : A + servizio()
x.servizio();
factoryMethod() ->
App return new B();
Scopo
Fornire un’interfaccia per la creazione di
famiglie di oggetti correlati o mutuamente
dipendenti
senza specificare le loro classi concrete
+ createWindow()
+ createScrollbar()
Factory1 Factory2
+ createWindow() + createWindow()
+ createScrollbar() + createScrollbar()
<<istantiates>>
<<istantiates>>
Client
Ab stractFactory
ProductA ProductB
+ createA()
+ createB()
… …
… ProductA1 ProductA2 ProductB1 Product B2
Factory1 Factory2
Scopo
Assicurare che una classe abbia un’unica istanza
Fornire un punto di accesso globale all’unica
istanza
Motivi/Esempi
Password
S.O.: stampante, file system, …
Azienda
Pattern facile, molto orientato al codice
Cliente1
Singleton
- static instance : S ingleton
Cliente2
- ...
class Singleton {
private static Singleton instance;
private int i = 1;
private Singleton() {}
public static Singleton getInstance() {
if (instance==null){
System.err.println("Istanza creata");
instance = new Singleton();
}
return instance;
}
public void set(int x) {i=x;}
public String toString() {return ""+i;}
}
>javac SubSingleton.java
SubSingleton.java:2: Singleton() has private access in
Singleton
public SubSingleton(int i) {}
^
1 error
>
java.lang.System
java.lang.Math
No, hanno il costruttore privato, ma sono utility
(metodi static)
System.out, System.in
No, sono oggetti, non classi…
Scopo
Creare una nuova istanza copiandola da un
oggetto preso ad esempio
I pattern creazionali precedenti isolano il
client di un oggetto dalla chiamata al suo
costruttore
Metodi che istanziano la classe appropriata
Prototype: metodo che restituisce una copia
dell’istanza
-protot ip o
+ m()
Prototipo
+ clona()
m ->
Protot ipo p;
p = p rot oti po.c lona();
PrototipoConcreto1 PrototipoConcreto2
+ cl ona() + clona()
Vantaggi
Il Client non “conosce” le classi concrete
“Parla” solo alla classe base Prototipo
prototipo può essergli passato come parametro
Posso aggiungere altre classi concrete
Visto di corsa (in Java c’è Object.clone())