Lezione 09 - Abstract Factory

16
Ingegneria del Software

Transcript of Lezione 09 - Abstract Factory

Page 1: Lezione 09 - Abstract Factory

Ingegneria del Software

Page 2: Lezione 09 - Abstract Factory

Introduzione al pattern…

Page 3: Lezione 09 - Abstract Factory

Ingegneria del Software - A.A. 2003/2004

Problema introduttivo n.1

• Si deve realizzare un’applicazione con GUI in grado di lavorare su piattaforme diverse (es. MS-Windows, MacOS, ecc).

• Il look and feel delle GUI dipende dalla piattaforma.

• Si crea una classe astratta per ogni oggetto grafico (text field, list box, ecc.) a poi si scrivono le relative sottoclassi concrete per ogni piattaforma considerata.

• Per rendere robusta l’applicazione bisogna assicurarsi che tutti gli oggetti creati siano quelli progettati per funzionare sulla piattaforma che si sta utilizzando

Come ottenere questa garanzia?Come ottenere questa garanzia?

Page 4: Lezione 09 - Abstract Factory

Ingegneria del Software - A.A. 2003/2004

Problema introduttivo n.2

• Si deve realizzare un programma che permette di eseguire in remoto procedure di diagnostica sui computer prodotti dalla Stellar Microsystem

• La Stellar ha progettato due famigliedi computer che si distinguono per le diverse architetture hardware, con componenti solo funzionalmente simili:– Chip CPU di Enginola– Chip in tecnologia RISC

chiamati ember, superember e ultraember

• Il programma di diagnostica deve poteristanziare il set di componenti giusto a seconda del tipo di computer da analizzare

Page 5: Lezione 09 - Abstract Factory

Ingegneria del Software - A.A. 2003/2004

Soluzione al problema introduttivo n.2

Page 6: Lezione 09 - Abstract Factory

Ingegneria del Software - A.A. 2003/2004

1

23

Page 7: Lezione 09 - Abstract Factory

Presentazione del pattern Abstract Factory

Page 8: Lezione 09 - Abstract Factory

Ingegneria del Software - A.A. 2003/2004

Il pattern Abstract Factory (1/8)

• Nome Abstract Factory [GoF95], conosciuto anche con il nome di Kit Pattern o Toolkit Pattern

• Synopsis Presenta un interfaccia per la creazione di famiglie di prodotti, in modo tale che il cliente non abbia conoscenza delle loro classi concrete. Questo consente:- di assicurarsi che il client crei soltanto prodotti

vincolati fra di loro- l’utilizzo di diverse famiglie di prodotti da parte

dello stesso client.

• Context Cfr. esempio introduttivo

Page 9: Lezione 09 - Abstract Factory

Ingegneria del Software - A.A. 2003/2004

Il pattern Abstract Factory (2/8)

• Forces - Un sistema che lavora con molti prodotti diversi dovrebbe funzionare indipendentemente dallo specifico prodotto

- E’ desiderabile poter configurare il sistema per lavorare con l’insieme di prodotti appartenenti ad una stessa famiglia

- Non si vuole legare il client ad una factory specifica, cioè ad una particolare famiglia di prodotti

Definizione interfacceper ogni prodotto

Definizione Factory

Definizione Abstract Factory

Page 10: Lezione 09 - Abstract Factory

Ingegneria del Software - A.A. 2003/2004

Il pattern Abstract Factory (3/8)

… a SolutionDa Context…

• Solution –Gli “attori” del pattern sono:

– Client

– AbstractFactory

– ConcreteFactoryX

–WidgetY

– ProductXWidgetY

Page 11: Lezione 09 - Abstract Factory

Ingegneria del Software - A.A. 2003/2004

Il pattern Abstract Factory (4/8)

• Consequences

- E’ facile aggiungere nuove famiglie di prodotti

- L’AbstractFactory assicura la creazione e l’utilizzo di una famiglia consistente di oggetti

- Può risultare molto impegnativo aggiungere nuovi widget o modificare uno già esistente

Page 12: Lezione 09 - Abstract Factory

Ingegneria del Software - A.A. 2003/2004

Il pattern Abstract Factory (5/8)

• Implementation- E’ raccomandabile implementare la classe AbstractFactory

come classe astratta e il metodo getFactory come metodostatico

- Se il client deve lavorare con una famiglia di prodotti pervolta si può usare una variabile statica per settare la factoryconcreta da usare

- Cfr. voce implementation del pattern Factory Method

• Java API usage- La classe java.awt.Toolkit è una abstract factory usata per

creare oggetti che interagiscono correttamente con i diversisistemi nativi di GUI

Page 13: Lezione 09 - Abstract Factory

Ingegneria del Software - A.A. 2003/2004

Il pattern Abstract Factory (6/8)

• Code example

public class Client {

public void doIt () {ArchitectureToolkit af;af = ArchitectureToolkit.getFactory(ArchitectureToolkit.EMBER);CPU cpu = af.createCPU();//...

}}

Client

Page 14: Lezione 09 - Abstract Factory

Ingegneria del Software - A.A. 2003/2004

Il pattern Abstract Factory (7/8)

public abstract class ArchitectureToolkit {public final static int ENGINOLA = 900;public final static int EMBER = 901;

// ...static final ArchitectureToolkit getFactory(int architecture) {

switch (architecture) {case ENGINOLA:

return new EnginolaToolkit();case EMBER:

return new EmberToolkit();// ...

}}

public abstract CPU createCPU() ;public abstract MMU createMMU() ;

}

ArchitectureToolkit

Page 15: Lezione 09 - Abstract Factory

Ingegneria del Software - A.A. 2003/2004

Il pattern Abstract Factory (8/8)

• Related PatternsFactory Method, Singleton

Page 16: Lezione 09 - Abstract Factory

Ingegneria del Software - A.A. 2003/2004

Domande?