Pattern Abstract Factory

Slides:



Advertisements
Presentazioni simili
Programmazione ad oggetti
Advertisements

Argomenti della lezione
Gestione della memoria centrale
Unified Modeling Language
Recupero debito quarto anno Primo incontro
Informatica Recupero debito quarto anno Terzo incontro.
Programmazione object oriented in C++
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
Classi ed Oggetti in Java (Cenni). Richiami Ruolo delle Classi in Java Oggetti.
29 febbraio 2008 Progettare tipi di dato astratti.
Liste di Interi Esercitazione. Liste Concatenate Tipo di dato utile per memorizzare sequenze di elementi di dimensioni variabile Definizione tipicamente.
Le gerarchie di tipi.
Metodologie di Programmazione = decomposizione basata su astrazioni
1 Le gerarchie di tipi: implementazioni multiple e principio di sostituzione.
1 Astrazioni sui dati : Ragionare sui Tipi di Dato Astratti.
Liste Ordinate 3 Maggio Ultima Lezione Abbiamo visto i tipi di dato astratti IntList e StringList Realizzano liste di interi e di stringhe Realizzati.
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
Fondamenti di Informatica
1 Programmazione ad oggetti in Java E.Mumolo, DEEI
L.Lista Design P atterns Luca Lista. L.Lista Design Patterns Elementi di software OO riutilizzabile Piccoli insiemi di classi che collaborano implementando.
Overriding.
Argomenti della lezione
Access: Query semplici
Dichiarazione di classi Programmazione Corso di laurea in Informatica.
© CEFRIEL Ricettario dei principali pattern GoF Docente: Gabriele Lombardi
Type int_stack = struct { int top; int P[100]; } int_stack creapila() { int_stack s = new int_stack; s.top = 0; return s; } int_stack push(int_stack s,
Type int_stack = struct { int top; int P[100]; } int_stack creapila() { int_stack s = new int_stack; s.top = 0; return s; } int_stack push(int_stack s,
1 Ereditarietà Una classe può essere derivata da una classe esistente usando la sintassi: public, protected e private specificano il tipo di accesso ai.
Le classi Definizione di classe Attributi e metodi di una classe Costruttori e distruttori Private e public Funzioni friend Il puntatore this.
Java base IV: Java e la programmazione O.O.
Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria.
Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria.
Programmazione in Java (8)
Introduzione alla programmazione Object Oriented
Enumerazioni e Classi 1. Enumerazioni Permettono di definire nuovi tipi che consistono in un insieme di valori costanti (ognuno con un nome) – Migliorano.
BIOINFO3 - Lezione 331 SUBROUTINE IN PERL Una subroutine (funzione, metodo, procedura o sottoprogramma), e` una prozione di codice all`interno di un programma.
Fopndamenti di programmazione. 2 La classe String Una stringa è una sequenza di caratteri La classe String è utilizzata per memorizzare caratteri La classe.
Fondamenti di Programmazione Prof.ssa Elisa Tiezzi
Capitolo 4 (Deitel) Le strutture di controllo in C
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA FINALE DEL 21 MAGGIO 2007 NOME: COGNOME: ________________________________________________________________________________.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
I metodi F. Bombi Campi e metodi Abbiamo visto che una classe può contenere – Campi – Metodi stato I campi sono utilizzati per memorizzare.
1 cin>>c8 s.r.l A.A Generalità Uno dei concetti largamente adottati negli ultimi anni dai professionisti del software in fase di sviluppo.
Esercizi Design pattern
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
Oggetti in C# Lezione 1 Classi ed istanze Oggetti in C# - Lezione 1.
Corso di Algoritmi e Strutture Dati con Laboratorio A.A. 2014/15 Libreria standard.
Una "vera" classe.. ..un esempio pratico: la calcolatrice
Programmazione ad oggetti
Oggetti in C# Lezione 2 Metodi e Static Oggetti in C# - Lezione 2.
Incapsulamento e information hiding
30/11/2004Laboratorio di Programmazione - Luca Tesei1 Interfacce e Polimorfismo.
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 7 Tipi di dato e strutture dati Specifica e realizzazione di strutture informative come classi.
L.Lista, V. Innocente Design P atterns Luca Lista, Vincenzo Innocente.
Programmazione in Java. Classi I programmi in Java consistono di classi. Le classi consentono di definire: collezioni di procedure (metodi statici) tipi.
Cose nuove di Java (prima a chiacchiera, poi formalmente)
LIP: 2 Maggio 2008 Classi Astratte. Cos’e’ una Classe Astratta una classe astratta e’ un particolare tipo di classe permette di fornire una implementazione.
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
Progettare una classe 21 Febbraio La classe BankAccount Vogliamo realizzare una classe i cui oggetti sono dei semplici conti bancari. * Identifichiamo.
1 Metodologie di Programmazione = decomposizione basata su astrazioni.
Esercitazione del 9 marzo 2007 Ereditarieta’. Richiami Definire sottoclassi (ereditarieta’) Overriding Specificatori di accesso (private, protected) Principio.
LIP: 4 Maggio 2007 Interfacce. Cos’e’ una Interfaccia una interfaccia e’ un particolare tipo di classe contiene solo la specifica non ha implementazione.
Fondamenti di informatica T-A Esercitazione 3 : Classi, metodi, visibilità, metodi statici AA 2012/2013 Tutor : Domenico Di Carlo.
XVRC2 Emanuele Ruffaldi Giugno Tre esperimenti con S3D ► Estensioni del Linguaggio ► Pre-Compilatore ► Esecuzione dentro il Java L C J.
1 Il livello transport. Concetti fondamentali - Canale logico e canale fisico 2 Quando un segnale deve essere trasmesso, viene inviato su un Canale, cioè.
Introduzione all’Ereditarietà Pietro Palladino. Richiami UML Classe: descrizione di un insieme di oggetti software con caratteristiche simili Definisce.
Due slides sui Design Patterns Luciano Pandola INFN-LNGS Corso INFN su C++, ROOT e Geant4.
Introduzione alle Classi e agli Oggetti in Java 1.
Transcript della presentazione:

Pattern Abstract Factory Introduzione Abstract Factory è creazionale e basato su oggetti ovvero, la creazione degli oggetti è delegata alle istanze di apposite classi Scopo: « fornire un'interfaccia per la creazione di famiglie di oggetti correlati o dipendenti senza specificare quali siano le loro classi concrete » (GoF) Detto anche: kit Alberto Venturini Pattern Abstract Factory

Pattern Abstract Factory Un esempio Vogliamo creare un labirinto: public class MazeGame { ... public Maze newMaze() { Maze maze = new Maze(); Room r1 = new Room(1); Room r2 = new Room(2); Door door = new Door(r1, r2); maze.addRoom(r1); maze.addRoom(r2); r1.setSide(East, door); r2.setSide(West, door); return maze; } Creiamo un labirinto con due stanze e una porta... r1 r2 Alberto Venturini Pattern Abstract Factory

Pattern Abstract Factory Un esempio E se... volessimo creare uno speciale labirinto “incantato”, con le stanze e le porte magiche? oppure un labirinto con le bombe? oppure con le trappole oppure... Alberto Venturini Pattern Abstract Factory

Pattern Abstract Factory Un esempio, esteso Certo, potremmo fare così... public Maze newMaze(int mazeType) { switch(mazeType) { case ENCHANTED: Maze maze = new EnchantedMaze(); Room r1 = new EnchantedRoom(); Room r2 = new EnchantedRoom(); Door door = new DoorNeedingSpell(r1, r2); break; case BOMBED: Maze maze = new BombedMaze(); Room r1 = new RoomWithBomb(); Room r2 = new RoomWithBomb(); Door door = new BombedDoor(r1, r2); case ... Ma cosa succede quando abbiamo tanti tipi diversi di labirinti? Alberto Venturini Pattern Abstract Factory

Pattern Abstract Factory Un esempio, esteso Problema: questo metodo è inflessibile il metodo newMaze() deve conoscere tutti i tipi possibili di labirinti e i nomi delle relative classi idealmente, i compiti del nostro newMaze() dovrebbero essere solo: creare un labirinto, senza occuparsi del tipo creare due stanze e una porta aggiungere le stanze e la porta al labirinto ... indipendentemente dal tipo particolare di labirinto creato! Alberto Venturini Pattern Abstract Factory

Pattern Abstract Factory Le factory Soluzione: spostare la logica di creazione da qualche altra parte ovvero, delegare la creazione dei vari oggetti ad una classe apposita una classe di questo tipo prende il nome di Factory gli oggetti creati da una factory vengono chiamati “prodotti” Alberto Venturini Pattern Abstract Factory

Pattern Abstract Factory Factory astratta Creiamo una factory per ogni tipo di labirinto EnchantedMazeFactory BombedMazeFactory ... Tutte queste factory sono sottoclassi di un'unica factory astratta Il metodo newMaze() deve conoscere solo l'interfaccia della factory astratta Alberto Venturini Pattern Abstract Factory

Ritornando al labirinto... In questo caso i metodi sono astratti ma potrebbero anche non esserlo ... La factory astratta: public abstract class MazeFactory { abstract public Maze createMaze(); abstract public Room createRoom(); abstract public Door createDoor(Room r1, Room r2); ... } e le factory concrete: public class EnchantedMazeFactory extends MazeFactory { public Maze createMaze() { return new EnchantedMaze(); } public Room createRoom() { return new EnchantedRoom(); } public Door createDoor(Room r1, Room r2) { return new DoorNeedingSpell(r1, r2); } public class BombedMazeFactory extends MazeFactory { ... } Alberto Venturini Pattern Abstract Factory

Pattern Abstract Factory Il metodo newMaze() Ora il metodo newMaze() della classe MazeGame (che è il client del pattern) diventa: public Maze newMaze(MazeFactory factory) { Maze maze = factory.createMaze(); Room r1 = factory.createRoom(1); Room r2 = factory.createRoom(2); Door door = factory.createDoor(r1, r2); ... return maze; } Alberto Venturini Pattern Abstract Factory

Pattern Abstract Factory Il metodo newMaze() La factory concreta da usare viene scelta in un altro punto del programma in un unico punto! Quindi è facile da cambiare per esempio la factory concreta può essere scelta durante l'inizializzazione del programma newMaze() non sa più niente circa i diversi tipi di “prodotti” (labirinti, porte, stanze, ...) ovvero, non conosce i “prodotti” concreti, ma solo quelli astratti quindi non deve conoscere le factory concrete, ma solo quella astratta Alberto Venturini Pattern Abstract Factory

Pattern Abstract Factory In immagini... Factory astratta Prodotto astratto Factory concrete Prodotti concreti Alberto Venturini Pattern Abstract Factory

Pattern Abstract Factory In UML ... Mancano i parametri di createDoor Alberto Venturini Pattern Abstract Factory

Il diagramma UML generale Alberto Venturini Pattern Abstract Factory

Pattern Abstract Factory I partecipanti Le factory AbstractFactory: dichiara un'interfaccia per la creazione di oggetti prodotto astratti ConcreteFactory: implementa le operazioni di creazione degli oggetti prodotto concreti I prodotti AbstractProduct: dichiara un'interfaccia per una tipologia di oggetti prodotto ConcreteProduct: definisce un oggetto prodotto che verrà creato dalla corrispondente factory concreta Il Client: utilizza soltanto le interfacce dichiarate dalle classi AbstractFactory e AbstractProduct Alberto Venturini Pattern Abstract Factory

Applicabilità Quando applicare il pattern Abstract Factory? quando vogliamo un sistema indipendente dalle modalità di creazione, composizione, rappresentazione dei suoi “prodotti” aggiungiamo altri 100 tipi di labirinti: dobbiamo cambiare qualcosa in newMaze() ? Platform Independence! Manufacturer Independence! Alberto Venturini Pattern Abstract Factory

Pattern Abstract Factory Applicabilità Quando applicare il pattern Abstract Factory? quando vogliamo avere la possibilità di scegliere tra più famiglie (“kit”) di prodotti quando vogliamo essere sicuri di usare solo i prodotti della famiglia scelta non vogliamo mescolare prodotti appartenenti a famiglie diverse! quando abbiamo una libreria di classi di cui vogliamo rivelare solo le interfacce, non le implementazioni Alberto Venturini Pattern Abstract Factory

Pattern Abstract Factory Un altro esempio Vogliamo scrivere un'applicazione grafica in grado di funzionare su desktop diversi Windows Mac OSX GTK ... Le operazioni per creare gli elementi grafici (widget) cambiano a seconda del desktop Alberto Venturini Pattern Abstract Factory

Pattern Abstract Factory Un altro esempio Obiettivi: rendere l'applicazione indipendente dal sistema desktop utilizzato non mescolare elementi appartenenti a differenti desktop L'applicazione vuole utilizzare vari widget (finestre, scrollbar, menu, bottoni)... ... ma non vuole sapere quale particolare famiglia di widget sta utilizzando! Alberto Venturini Pattern Abstract Factory

Pattern Abstract Factory Un altro esempio Una piccola dimostrazione pratica: demoAbstractFactory.java Alberto Venturini Pattern Abstract Factory

Pattern Abstract Factory Un altro esempio Alberto Venturini Pattern Abstract Factory

Vantaggi di Abstract Factory Isola le classi concrete dei prodotti il client manipola le istanze dei prodotti solo attraverso le loro interfacce astratte la creazione di nuovi prodotti è responsibilità delle factory Il client è indipendente dalle classi effettivamente utilizzate per l'implementazione dei prodotti Alberto Venturini Pattern Abstract Factory

Vantaggi di Abstract Factory Consente di cambiare in modo semplice la famiglia di prodotti utilizzata in tutta l'applicazione, la scelta della factory concreta compare in un punto solo Promuove la coerenza nell'utilizzo dei prodotti i prodotti di una stessa famiglia sono progettati per essere utilizzati insieme quando un'applicazione sceglie una factory, userà solo i prodotti di quella factory Alberto Venturini Pattern Abstract Factory

Pattern Abstract Factory Uno svantaggio... L'aggiunta del supporto per nuove tipologie di prodotti è difficile il set di prodotti è determinato dall'interfaccia di Abstract Factory... ... quindi, se vogliamo aggiungere un prodotto, dobbiamo modificare l'interfaccia di Abstract factory e, di conseguenza, tutte le factory concrete una possibile soluzione: definire factory estendibili Alberto Venturini Pattern Abstract Factory

Pattern Abstract Factory Factory estendibili Nelle factory, invece di definire un metodo di creazione per ogni prodotto... createMaze() createDoor() createRoom() create... ... definiamo un unico metodo make make assume come input un parametro che indica il tipo di oggetto da creare make(String type) Alberto Venturini Pattern Abstract Factory

Pattern Abstract Factory Factory estendibili Problema: che cosa ritorna make? possiamo definire una unica interfaccia astratta Product: Product make(String type) ... e definiamo tutti i vari prodotti come sottoclassi di Product in questo modo, però, il client può accedere ai prodotti solo attraverso l'interfaccia generica di Product se ci sono operazioni specifiche per un prodotto, non sono accessibili attraverso Product soluzione (poco sicura): downcast Alberto Venturini Pattern Abstract Factory

Abstract Factory + Prototype Nell'esempio del labirinto, supponiamo di voler aggiungere dei nuovi tipi di labirinto che magari si differenziano tra loro solo per alcuni dettagli per esempio, un labirinto con le stanze incantate ma le porte normali... Per ogni nuova “famiglia” di labirinti dobbiamo definire una nuova factory concreta anche se magari è simile ad altre factory già esistenti Alberto Venturini Pattern Abstract Factory

Abstract Factory + Prototype ... oppure possiamo usare il pattern Prototype definiamo una sola factory concreta quando il client vuole usare la factory, la inizializza con i prototipi dei prodotti da creare un prototipo è un'istanza di un prodotto quando la factory deve creare un nuovo prodotto, lo clona dal prototipo Alberto Venturini Pattern Abstract Factory

Abstract Factory + Prototype Per esempio: public class ProtoMazeFactory extends MazeFactory { private Maze protoMaze; private Room protoRoom; private Door protoDoor; ... public ProtoMazeFactory(Maze m , Room r, Door d) { protoMaze = m; protoRoom = r; protoDoor = d; } public createMaze() { return protoMaze.clone(); Quando il client inizializza una nuova factory: ProtoMazeFactory fancyFactory = new ProtoMazeFactory( new simpleMaze(), new EnchantedRoom(), new BombedDoor()); Maze maze = fancyFactory.createMaze(); Door door = fancyFactory.createDoor(); Room room = fancyFactory.createRoom(); Alberto Venturini Pattern Abstract Factory

Abstract Factory + Singleton Normalmente, ad una applicazione serve una sola istanza di una factory concreta Quindi è possibile combinare Abstract factory con Singleton ogni factory concreta è un singleton in questo modo ci assicuriamo che esista al più una istanza di ogni factory concreta Alberto Venturini Pattern Abstract Factory

Pattern Abstract Factory Conclusione I concetti chiave di Abstract Factory: delega della creazione: la responsabilità della creazione di nuovi oggetti è incapsulata in classi apposite (le factory) famiglie di oggetti: ci si assicura che i prodotti usati appartengano alla stessa famiglia (“kit”) indipendenza del client: il client dipende dalle interfacce, non dalle implementazioni Riprendendo lo scopo: « fornire un'interfaccia per la creazione di famiglie di oggetti correlati o dipendenti senza specificare quali siano le loro classi concrete » (GoF) Alberto Venturini Pattern Abstract Factory