Programmazione Orientata agli Oggetti in Linguaggio Java Sommario
Transcript
Programmazione Orientata agli Oggetti in Linguaggio Java Sommario
26/01/2005 Programmazione Orientata agli Oggetti in Linguaggio Java Design Pattern: Storia Parte b versione 2.1 Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons (vedi ultima pagina) G. Mecca – Università della Basilicata – [email protected] Design Pattern: Storia >> Sommario Sommario m Una Visione Critica dei Pattern Originali m Il Pattern Singleton m Il Pattern Factory Method G. Mecca - Programmazione Orientata agli Oggetti 2 1 26/01/2005 Design Pattern: Storia >> I Pattern Originali Dopo 10 anni I Pattern Originali Dopo 10 Anni m Dopo 10 anni ðalla conferenza OOPSLA 2004, una tavola rotonda sui pattern della GoF 10 anni dopo m Obiettivo ðverificare quali tra i pattern originali si sono realmente confermati come soluzioni efficaci nel tempo ðe quali, viceversa, avrebbero potuto essere omessi G. Mecca - Programmazione Orientata agli Oggetti 3 Design Pattern: Storia >> I Pattern Originali Dopo 10 anni I Pattern Originali Dopo 10 Anni m Il responso ðalcuni pattern da rimuovere ðalcuni pattern discutibili m Pattern da rimuovere ðBridge, Interpreter m Pattern discutibili ðSingleton, Chain of Responsibility (poco usato) G. Mecca - Programmazione Orientata agli Oggetti 4 2 26/01/2005 Design Pattern: Storia >> Il Pattern Singleton Nome: Singleton Categoria: creazionale Il Pattern Singleton m Un Difficoltà di apprendimento limitata Difficoltà di applicazione media esempio di pattern discusso ðSingleton ðè un pattern di tipo “creazionale” m Descrizione del pattern ðserve a creare una classe con un’unica istanza, che rappresenta un oggetto con visibilità “globale”, accessibile in tutta l’applicazione G. Mecca - Programmazione Orientata agli Oggetti 5 Design Pattern: Storia >> Il Pattern Singleton Il Pattern Singleton >> volpiEConigli2 – Configurazione.java m Esempio ðvolpi e conigli ðper ciascuna esecuzione c’è un’unica configurazione della simulazione ðè opportuno che la configurazione sia visibile da molte classi (Gioco, Volpe, Coniglio, Test) >> visibilità globale m In questo caso ðè possibile applicare il singleton G. Mecca - Programmazione Orientata agli Oggetti 6 3 26/01/2005 Design Pattern: Storia >> Il Pattern Singleton package it.unibas.volpieconigli2.modello; public class Configurazione { private int numeroRighe; private int numeroColonne; ... il riferimento all’unica istanza della classe viene mantenuto come valore della proprietà statica singleton es: singleton vale #2367 private static Configurazione singleton = new Configurazione(); private Configurazione() {} public static Configurazione getInstance() { return Configurazione.singleton; } public void carica(String nomeFile) throws Exception { java.util.Properties proprieta = caricaProperties(nomeFile); ... } il costruttore è privato; non è possibile creare oggetti all’esterno il metodo getInstance() restituisce sempre lo stesso riferimento (#2367) public int getNumeroInizialeConigli() { return (int)(this.numeroRighe * this.numeroColonne * this.percentualeConigli); } ... } G. Mecca - Programmazione Orientata agli Oggetti 7 Design Pattern: Storia >> Il Pattern Singleton Il Pattern Singleton m In tutte le altre classi ðposso ottenere il riferimento al singleton attraverso la chiamata Configurazione.getInstance() ðe poi chiamarne i metodi; es: Configurazione.getInstance().getNumeroRighe(); Configurazione.getInstance().getFameLimiteVolpi(); G. Mecca - Programmazione Orientata agli Oggetti 8 4 26/01/2005 Design Pattern: Storia >> Il Pattern Singleton Il Pattern Singleton Singleton Diagramma UML della GoF Singleton static uniqueInstance field1 field2 static Instance() method1() method2() return uniqueInstance fonte: Design Patterns – Elements of Reusable OO Code 9 G. Mecca - Programmazione Orientata agli Oggetti Design Pattern: Storia >> Il Pattern Singleton Il Pattern Singleton m Perchè singleton è discutibile ? ðper via di due problemi m Problema n. 1 ðutilizzo esagerato ðè opportuno usare un singleton solo nei casi in cui serve effettivamente un componente unico e globale ðma questa scelta non deve essere frettolosa G. Mecca - Programmazione Orientata agli Oggetti 10 5 26/01/2005 Design Pattern: Storia >> Il Pattern Singleton Il Pattern Singleton m Esempio: scacchiera ðpotrebbe essere un singleton ? m In generale no ðnon è indispensabile la visibilità globale ðche deve essere, per quanto possibile, impedita ðaltrimenti altri componenti potrebbero per errore modificare lo stato della scacchiera G. Mecca - Programmazione Orientata agli Oggetti 11 Design Pattern: Storia >> Il Pattern Singleton Il Pattern Singleton m In altri termini ðper poter essere un singleton, un componente deve essere effettivamente condivisibili a livello globale ðovvero tale per cui, pur essendo condiviso tra vari client, questi non possano interferire tra di loro modificandone lo stato ðnel caso di configurazione questo rischio è molto basso perchè i metodi set sono privati ðun altro esempio plausibile di singleton: Console G. Mecca - Programmazione Orientata agli Oggetti 12 6 26/01/2005 Design Pattern: Storia >> Il Pattern Singleton Il Pattern Singleton m Ma in effetti, a pensarci bene ðla stessa configurazione potrebbe non essere per sempre un singleton ðse mettessi in linea l’applicazione su un sito Web, potrei avere vari giocatori che giocano, ciascuno con la sua configurazione ða quel punto il singleton non andrebbe più bene G. Mecca - Programmazione Orientata agli Oggetti 13 Design Pattern: Storia >> Il Pattern Singleton Il Pattern Singleton m Problema n. 2 ðquando è realmente utile il singleton ? m Infatti ðsi tratta un componente “unico” visibile in tutta l’applicazione m Ma... ðquesto è equivalente ad una classe con costruttore privato e metodi statici G. Mecca - Programmazione Orientata agli Oggetti 14 7 26/01/2005 Design Pattern: Storia >> Il Pattern Singleton Il Pattern Singleton m In effetti ðnella versione originale, Configurazione era un componente statico ðesattamente come it.unibas.utilita.Console m Di conseguenza ðin molti casi l’utilizzo di un singleton può essere surrogato utilizzando viceversa un componente statico G. Mecca - Programmazione Orientata agli Oggetti 15 Design Pattern: Storia >> Il Pattern Singleton Il Pattern Singleton m Quando serve realmente il singleton? ðci sono due casi in cui è indispensabile mI caso ðho bisogno di un oggetto, ovvero di manipolare un riferimento m II caso ðil componente unico deve avere comportamento polimorfo (alcuni dei metodi devono essere sovrascritti nelle sottoclassi) G. Mecca - Programmazione Orientata agli Oggetti 16 8 26/01/2005 Design Pattern: Storia >> Il Pattern Singleton Il Pattern Singleton m Un esempio del I caso ðAnimaleNullObject in volpi e conigli m Infatti ðcostruire tanti oggetti di tipo animale nullo è inutile, visto che si comportano tutti allo stesso modo ðmi basta un componente unico e globale ðma deve essere necessariamente un oggetto perchè devo disporlo sulla scacchiera G. Mecca - Programmazione Orientata agli Oggetti 17 Design Pattern: Storia >> Il Pattern Singleton package it.unibas.volpieconigli2.modello; public class AnimaleNullObjectSingleton { private static AnimaleNullObjectSingleton singleton = new AnimaleNullObjectSingleton(); private AnimaleNullObjectSingleton() {} public static AnimaleNullObjectSingleton getInstance() { return singleton; } public boolean isConiglio() { return false; } public void agisci(Scacchiera scacchiera) { return; } public String toString() { return " "; } } G. Mecca - Programmazione Orientata agli Oggetti 18 9 26/01/2005 Design Pattern: Storia >> Il Pattern Singleton Il Pattern Singleton m In questo caso ðcambia l’inizializzazione della scacchiera public Scacchiera(int numeroRighe, int numeroColonne) { elementi = new Animale[numeroRighe][numeroColonne]; for (int i = 0; i < numeroRighe; i++) { for (int j = 0; j < numeroColonne; j++) { elementi[i][j] = AnimaleNullObjectSingleton.getInstance(); } } } G. Mecca - Programmazione Orientata agli Oggetti 19 Design Pattern: Storia >> Il Pattern Singleton Il Pattern Singleton m Un esempio del II caso ðin Java non esiste ðdal momento che una classe basata su singleton non può essere estesa m Infatti ðse il costruttore è privato la classe diventa automaticamente finale G. Mecca - Programmazione Orientata agli Oggetti 20 10 26/01/2005 Design Pattern: Storia >> Il Pattern Singleton Il Pattern Singleton m La soluzione del libro originale ðdichiarare il costruttore protected ðma anche questo in Java non ha senso, perchè non si tratta più di un singleton (se il costruttore è protected, altre classi dello stesso package possono creare oggetti) m Viceversa ðla soluzione originale con costruttore protected aveva senso in C++ G. Mecca - Programmazione Orientata agli Oggetti 21 Design Pattern: Storia >> Il Pattern Singleton Il Pattern Singleton m Di conseguenza ðin Java, l’ambito di applicabilità del singleton è molto limitato ðha senso solo in casi simili a quello di AnimaleNullObject ðbisogna evitare di applicarlo quando non è indispensabile G. Mecca - Programmazione Orientata agli Oggetti 22 11 26/01/2005 Design Pattern: Storia >> Riassumendo Riassumendo m Creational patterns (5) ð ð ð ð ð m m Structural Patterns (7) ð ð ð ð ð ð ð Adapter Bridge (da rimuovere) Composite Decorator Facade (visto) Flyweight Proxy Behavioral Patterns (11) ð Chain of Responsibility (discutibile) ð Command ð Interpreter (da rimuovere) ð Iterator ð Mediator ð Memento ð Observer ð State ð Strategy ð Template Method ð Visitor Abstract Factory Builder Factory Method Prototype Singleton (discutibile, visto) m Altri pattern ð Null Object (visto) ð DAO (visto) G. Mecca - Programmazione Orientata agli Oggetti 23 Design Pattern: Storia >> Sommario Riassumendo m Una Visione Critica dei Pattern Originali m Il Pattern Singleton m Il Pattern Factory Method G. Mecca - Programmazione Orientata agli Oggetti 24 12 26/01/2005 Termini della Licenza Termini della Licenza m This work is licensed under the Creative Commons AttributionShareAlike License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/1.0/ or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. m Questo lavoro viene concesso in uso secondo i termini della licenza “Attribution-ShareAlike” di Creative Commons. Per ottenere una copia della licenza, è possibile visitare http://creativecommons.org/licenses/by-sa/1.0/ oppure inviare una lettera all’indirizzo Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. G. Mecca - Programmazione Orientata agli Oggetti 25 13
Documenti analoghi
Singleton Pattern - Home Page Danilo Spada
Elements of Reusable Object-Oriented Software” di Erich Gamma, Richard Helm, Ralph
Johnson e John Vlissides.
Gli autori del libro dichiarano di non essere a conoscenza di come si sia originato l'ep...
Sul pattern Singleton 1 Introduzione
Si tratta anzitutto di rendere impossible l’uso del costrutto new da parte del programma utente e di fornire un
metodo indiretto per ottenere una istanza (l’unica) della classe.
A tal fine occorre:
...
Singleton - Tiziano Manni
istanziazione di un unico oggetto, tramite l’invocazione a un metodo
della classe, incaricato della produzione degli oggetti. Le diverse
richieste di istanziazione, comportano la restituzione di un...