Progettazione : Design Pattern Creazionali Alessandro Martinelli alessandro.martinelli@unipv.it 30 Novembre 2010 Progettazione : Design Pattern Creazionali Aspetti generali dei Design Pattern Creazionali Factory Method Singleton Prototype Abstract Factory Builder Fondamenti di Informatica II
Design Pattern Creazionali Aspetti generali dei Design Pattern Creazionali(1/2) I Design Pattern Creazionali creano delle astrazioni sul processo di istanziazione rendendo il sistema indipendente da come gli oggetti sono creati (Esempi Principale: Pattern AbstractFactory). Spesso sono utilizzati quando la creazione di un oggetto o di un sistema è definita per piccoli componenti più piccoli piuttosto che creando complessi meccanismo gerarchici basati sull ereditarietà (Esempi Principale: Pattern Builder). Si astrae sui componenti di un modulo, mentre la struttura del modulo resta concreta. A. Martinelli () Design Pattern Creazionali 30/11/2010 2 / 21
Design Pattern Creazionali Aspetti generali dei Design Pattern Creazionali(2/2) Due caratteristiche ricorrenti in questi pattern: Nascondono la conoscenza riguardo a quali classi concrete sono effettivamente usate. Nascondono il modo con cui specifiche istanza vengono create ed organizzate. Nota Come vedremo anche per gli altri pattern, ci sono circostanze in cui i pattern creazionali sono alternativi tra di loro, così come casi in cui è utili usarli in modo misto. A. Martinelli () Design Pattern Creazionali 30/11/2010 3 / 21
Factory Method Factory Method Nome alternativo : Costruttore Virtuale Obiettivo Definire una funzione astratta per la generazione di un oggetto, in modo tale che la generazione dell oggetto sia delegata alle sotto classi. Esempio Si vuole scrivere una libreria generale per la gestione dei dati di un insieme di Dipendeti, che venga poi applicata alla gestione dei dati dei Muratori che sono dipendenti di una azienda impegnata nell Edilizia. La Classe Muratore estende la Classe Dipendente Voglio tuttavia scrivere delle funzionalità sui Dipendenti che funzionino per qualsiasi Dipendente. Nella mia applicazione, il processo dovrebbe usare solo istanza di Muratore. Ho bisogno di un meccanismo che astragga sol modo con cui sono istanziati i Dipendenti. A. Martinelli () Design Pattern Creazionali 30/11/2010 4 / 21
Factory Method Factory Method: Struttura A. Martinelli () Design Pattern Creazionali 30/11/2010 5 / 21
Factory Method Factory Method: Partecipanti e Caratteristiche Partecipanti: Product definisce l interfaccia o la generalizzazione per oggetti prodotti dal FactoryMethod (il Dipendente). ConcreteProduct oggetto concreto che implementa/estende il Prodotto (il Muratore). Creator definise il Factory Method, che ritorna un oggetto di tipo prodotto. ConcreteCreator implementa il Factory Method, fornendo una istanza di ConcreteProduct. Caratteristiche: Astrarre sul modo con cui un oggetto viene istanziato. Possono essere utilizzati per l implementazione delle AbstractFactory. A. Martinelli () Design Pattern Creazionali 30/11/2010 6 / 21
Factory Method Factory Method: Esempio di Codice Un Factory Method Astrazione : publ ic i n t e r f a c e DipendenteCreator { public Dipendente generatedipendente ( String nome, String cognome, Date nascita, i nt matricola ) ; } Implementazione : publ ic i n t e r f a c e MuratoreCreator implements DipendeteCreator { public Dipendente generatedipendente ( String nome, String cognome, Date nascita, i nt matricola ){ return new Muratore (nome, cognome, nascita, i nt matricola ) ; } } A. Martinelli () Design Pattern Creazionali 30/11/2010 7 / 21
Prototype Prototype Obiettivo Specifica le istanze che devono essere generate fornendo dei prototipi. I prototipi possono essere clonati, fornendo nuove istanze per una certa tipologia di oggetti. Esempio Si vuole realizzare un applicativo per l editing digitale di spartiti musicali. Il programma consente di posizionare su un Pannello contenente un pentagramma note, pause ed altri simboli. Gli elementi sono generati premendo su alcuni pulsanti che generano elementi grafici da trascinare all interno del pentagramma. Ogni nota porta con se informazioni relative al suono ed una rappresentazione grafica. Premendo su appositi pulsanti, sono in grado di generare nuove istanze per un certo oggetto, ad esempio la nota da un quarto Tutte le note da un quarto sono uguali all inizio del processo di inserimento Trascinando una nota in un punto del pentagramma, le vengono assegnate informazioni aggiuntive. A. Martinelli () Design Pattern Creazionali 30/11/2010 8 / 21
Prototype Prototype: Struttura A. Martinelli () Design Pattern Creazionali 30/11/2010 9 / 21
Prototype Prototype: Partecipanti e Caratteristiche Partecipanti: Prototype un oggetto che dichiara una interfaccia per clonare se stesso ConcretePrototype Un oggetto che implementa Prototype Client Un programma che a run-time crea un nuovo oggetto clonando un prototipo. Caratteristiche: Consente di istanziare e selezionare le classi corrette a run-time. E una soluzione che consente di scrivere meno codice quando l alternativa sarebbe usare l ereditarietà per creare un numero molto grande di classi poco dissimili tra di loro (nell esempio: una classe diversa per ogni nota o pausa). E utile inoltre quando le istanze di una classe posso avere soltanto un numero finito (e piccolo) di combinazioni dei parametri. A. Martinelli () Design Pattern Creazionali 30/11/2010 10 / 21
Singleton Singleton Obiettivo Il Singleton si applica quando è importante assicurarsi che di una classe esista unicamente una istanza Esempio Quando realizzo un sistema, spesso ci sono delle funzionalità condivise, di cui ci deve essere una unica istanza a disposizione Gestore del File System Gestore delle Risorse di Stampa A. Martinelli () Design Pattern Creazionali 30/11/2010 11 / 21
Singleton Singleton: Struttura A. Martinelli () Design Pattern Creazionali 30/11/2010 12 / 21
Singleton Singleton: Esempio di Codice Un Singleton publ ic cl a s s Singleton { private s t a t i c Singleton s i n gletonin s t a nce=new Singleton ( ) ; private Singleton (){ } publ ic s t a t i c Singleton getsi ngletoninstance (){ return s i ngletoninstance ; } publ ic void function1 (){ } publ ic void function2 (){ } } NOTA Se il costruttore viene definito private, nessuno sarà in grado di estendere un Singleton Se il costruttore viene definito protected, sarà possibile fornire implementazioni differenti di un Singleton per ereditarietà. A. Martinelli () Design Pattern Creazionali 30/11/2010 13 / 21
Abstract Factory Abstract Factory Nomi alternativi: Kit Obiettivo Creare una interfaccia da utilizzare per la creazione di famiglie o gruppi di oggetti senza specificare le loro classi concrete. Esempio Ad un libreria per interfacce grafiche si vuole associare differenti look-and-feel. E necessario creare un sistema che consenta di assegnare componenti differenti per il look-and-feel di ogni elemento (pulsanti, pannelli) Per fare questo, è necessario astrarre sui singoli elementi, ad esempio creando una astrazione PulsanteDrawer, PannelloDrawer etc. Il meccanismo è implementato con una Factory, ovvero una classe in grado di fabbricare istanze di PulsanteDrawer, PannelloDrawer etc. Tuttavia: anche per la Factory si vuole creare una astrazione, in modo tale da poter cambiare dinamicamente il modo in cui i Drawer vengono prodotti. Questo consente di assegnare all intero sistema dei look differenti. A. Martinelli () Design Pattern Creazionali 30/11/2010 14 / 21
Abstract Factory Abstract Factory: Struttura A. Martinelli () Design Pattern Creazionali 30/11/2010 15 / 21
Abstract Factory Abstract Factory: Partecipanti Partecipanti: AbstractFactory: dichiara una interfaccia per operazioni che creano istanze di oggetti di tipo AbstractProduct ConcreteFactory: implementa le operazioni per ottenere istanze di prodotti concreti. AbstractProduct: dichiara una interfaccia per un tipo di oggetto da Produrre ConcreteProduct: definisce un prodotto, che deve essere istanziato da una specifica ConcreteFactory. Implementa la AbstractProduct interface. Client: il sistema che ha bisogno delle istanze di ConcreteProduct, ma che dipende unicamente dalle interfacce. NOTA in questo pattern, è corretto (anzi necessario) che ci sia una Dipendenza tra la ConcreteFactory e i suoi ConcreteProduct. A. Martinelli () Design Pattern Creazionali 30/11/2010 16 / 21
Abstract Factory Abstract Factory: Caratteristiche Normalmente, un sistema avrà sempre bisogno di una unica Istanza di una Abstract/ConcreteFactory. Per questo motivo spesso la AbstractFactory si implementa con un Pattern Singleton. La singola AbstractFactory si basa su un meccanismo di istanziazione dei singoli elementi che di fatto è implementabile con un Pattern Factory Method. L implementazione di una AbstractFactory può poi basarsi sul meccanismo dei Pattern Prototype. Isola le classi concrete necessarie ad un sistema Consente un rapido cambio di famiglie intere di prodotti/istanze Rende più semplice la gestione di famiglie di elementi che devono per forza cooperare tra di loro (sui quali, cioè, è indispensabile che ci siano delle dipendenze) Svantaggio: rende difficile allargare una famiglia di prodotti introducendo nuove tipologie di elementi. E quindi meno adatta su un sistema dove non è possibile definire facilmente tutte le tipologie di AbstractProduct. A. Martinelli () Design Pattern Creazionali 30/11/2010 17 / 21
Builder Builder Obiettivo Astrarre sul meccanismo di costruzione di un oggetto, delegando alcune parti della costruzione dell oggetto stesso a classi derivate. In questo modo, un unico algortimo di costruzione consente di ottenere oggetti diversi. Esempio Si vuole creare una funzionalità di esportazione per un programma che usa formati file differenti: I dati del programma sono sempre gli stessi ed hanno la stessa struttura L algoritmo di scrittura dei file quindi segue gli stessi passaggi Tuttavia il modo con cui i singoli elementi di un file devono essere scritti può cdambiare A. Martinelli () Design Pattern Creazionali 30/11/2010 18 / 21
Builder Builder: Struttura A. Martinelli () Design Pattern Creazionali 30/11/2010 19 / 21
Builder Builder: Partecipanti e Caratteristiche Partecipanti: Builder: interfaccia astratta per creare una parte o un elemento di un oggetto. ConcreteBuilder: una implementazione del Builder che costruisce ed assembla le parti di un prodotto. Director: costruisce un oggetto usando il builder. Il Director implementa tecnicamente un algoritmo astratto. Product: rappresenta l oggetto effettivamente costruito, di cui il ConcreteBuilder definisce la parte. NOTA la coppia Director-Builder è definita con una classe concreta dipendente da una interfaccia. Una alternativa in alcune circostanza buona può essere quella di fondere i due elementi in una unica classe astratta, che contiene le funzionalità concrete del Director e le astrazioni del Builder. Caratteristiche Isola il codice necessario alla costruzione e rappresentazione di un Prodotto. consente di variare la rappresentazione interna di un oggetto. A. Martinelli () Design Pattern Creazionali 30/11/2010 20 / 21
Builder Builder: Un Algoritmo di Costruzione A. Martinelli () Design Pattern Creazionali 30/11/2010 21 / 21