Lezione 09 - Abstract Factory

Post on 28-Jun-2015

1.150 views 0 download

Transcript of Lezione 09 - Abstract Factory

Ingegneria del Software

Introduzione al pattern…

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?

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

Ingegneria del Software - A.A. 2003/2004

Soluzione al problema introduttivo n.2

Ingegneria del Software - A.A. 2003/2004

1

23

Presentazione del pattern 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

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

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

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

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

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

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

Ingegneria del Software - A.A. 2003/2004

Il pattern Abstract Factory (8/8)

• Related PatternsFactory Method, Singleton

Ingegneria del Software - A.A. 2003/2004

Domande?