SlideShare une entreprise Scribd logo
1  sur  16
Télécharger pour lire hors ligne
Ingegneria del Software
Introduzione al pattern…
Laboratorio

Definire :
• una classe PrintSpooler che:
             PrintSpooler
   – non ammette la contemporanea esistenza di due o più istanze;
   – contiene il metodo void stampa(String msg)

• una classe con main(String[] arg) che tenta di ottenere il
  riferimento a due istanze printSpooler in due istruzioni
  consecutive

• I risultati visualizzati:        C:jdk1.4binjava SingleSpooler
                                   Opening one spooler
                                   printer opened
                                   Opening two spoolers
                                   Only one spooler allowed



                      Ingegneria del Software - A.A. 2003/2004
Soluzione exception based


• Passo 1: la classe SingletonException

//new exception type for singleton classes
class SingletonException extends RuntimeException{
  public SingletonException(){
      super();
  }
  public SingletonException(String s){
      super(s);
  }
}


                Ingegneria del Software - A.A. 2003/2004
Soluzione exception based


•   Passo 2: la classe PrintSpooler

class PrintSpooler {
   static boolean instance_flag=false; //true if 1 instance
   public PrintSpooler() throws SingletonException {
     if (instance_flag)throw
       new SingletonException(“Only one spooler allowed");
     else
       instance_flag = true; //set flag for 1 instance
     System.out.println("spooler opened");
   }
   public void finalize(){
       instance_flag = false; //clear if destroyed
   }
}
                         Ingegneria del Software - A.A. 2003/2004
Soluzione exception based


• Passo 3: la classe singleSpooler

public class SingleSpooler {
             singleSpooler
  static public void main(String argv[]){
      PrintSpooler pr1, pr2;
      System.out.println("Opening one spooler");
      try {
             pr1 = new PrintSpooler();
      } catch(SingletonException e){…}
      System.out.println("Opening two spoolers");
      try {
            pr2 = new PrintSpooler();
      } catch(SingletonException e){…}
  }
}
                    Ingegneria del Software - A.A. 2003/2004
Soluzione static class based



• Classe PrintSpooler con tutti i metodi statici

final class PrintSpooler {
  static public void print(String s){
      System.out.println(s);
  }
}
              StaticPrint
public class staticPrint {
  public static void main(String argv[]){
      PrintSpooler.print("here it is");
  }
}


                    Ingegneria del Software - A.A. 2003/2004
Soluzione static method based


• Classe iSpooler con costruttore privato e metodo statico

class iSpooler {
  static boolean instance_flag = false;
  private iSpooler() { }            Costruttore privato
  static public iSpooler getInstance(){
      if (! instance_flag){
            instance_flag = true;      Metodo statico
            return new iSpooler();
      } else return null;
  }
    public void finalize(){ instance_flag = false;}
}


                    Ingegneria del Software - A.A. 2003/2004
Confronto tra le soluzioni



• Osservazioni alla soluzione exception based
   – Bisogna preoccuparsi di gestire le eccezioni
   – Fortemente legata al mondo Java
   – Rilascio “automatico” dello spooler non banale in Java


• Soluzione static class based
   – Soluzione non scalabile


• Souzione static method based
   – Rilascio “automatico” dello spooler non banale in Java (cfr.
     funzionamento del Garbage Collector)



                     Ingegneria del Software - A.A. 2003/2004
Pattern
Singleton
Il pattern Singleton (1/5)


•   Nome       Singleton [GoF95]

•   Synopsis   Il pattern Singleton garantisce che sia possibile
               creare una sola istanza della classe

•   Context    - Classi che dovrebbero avere esattamente un’
                 istanza
               - Esempio:
                       Classe che assicura che non sia riprodotto
                       più di un brano musicale per volta.
                       Questa classe dovrebbe sospendere
                       l’esecuzione di un brano prima di iniziare a
                       riprodurre il successivo.


                     Ingegneria del Software - A.A. 2003/2004
Il pattern Singleton (2/5)


•   Forces     - Deve esistere esattamente un’istanza di una
                 classe
               - L’unica istanza della classe deve essere
                 accessibile a tutti i client di quella classe

•   Solution   Una classe singleton ha:
                - una variabile statica privata che contiene il
                  riferimento alla sua unica istanza
                - i costruttori privati
                - un metodo statico, tipicamente chiamato
                  getInstance o getClassname, che ritorna il
                  riferimento all’unica istanza



                     Ingegneria del Software - A.A. 2003/2004
Il pattern Singleton (3/5)




            Da Context
             a Solution


   Ingegneria del Software - A.A. 2003/2004
Il pattern Singleton (4/5)



•   Consequences

             - Esiste esattamente un’istanza della classe

             - Per ottenere il riferimento dell’istanza le classi
               client devono invocare il metodo statico
               getInstance e non usare il costruttore

             - La specializzazione di una classe singleton è
               scomoda e genera classi imperfette dal punto di
               vista dell’incapsulamento. Problemi:
                     - classi con costruttori privati non
                       estendibili
                     - metodi statici non riscrivibili


                   Ingegneria del Software - A.A. 2003/2004
Il pattern Singleton (5/5)


•   Implementation     - Assicurarsi di dichiarare almeno un
                         costruttore privato
                       - Considerare il funzionamento del
                         garbage collector ed utilizzare
                         opportunamente il metodo finalize()

•   Java API usage     - La classe java.lang.Runtime è una
                         classe singleton (metodo statico
                         getRuntime())

•   Code example       - Esercizio: scrivere il codice dell’esempio
                                    presentato in context

•   Related Patterns - cfr. Abstract Factory, Builder, Prototype


                     Ingegneria del Software - A.A. 2003/2004
Domande?




Ingegneria del Software - A.A. 2003/2004

Contenu connexe

Similaire à Lezione 01 - Singleton

Design pattern template method
Design pattern template methodDesign pattern template method
Design pattern template methodNelson Firmani
 
Lezione 09 - Abstract Factory
Lezione 09 - Abstract FactoryLezione 09 - Abstract Factory
Lezione 09 - Abstract FactoryMarco Bianchi
 
Lezione 04 - Factory method
Lezione 04 - Factory methodLezione 04 - Factory method
Lezione 04 - Factory methodMarco Bianchi
 
Real Spring Aop Recipes For Your Everyday Job
Real Spring Aop Recipes For Your Everyday JobReal Spring Aop Recipes For Your Everyday Job
Real Spring Aop Recipes For Your Everyday JobMassimiliano Dessì
 
Lezione 02 - Delegation
Lezione 02 - DelegationLezione 02 - Delegation
Lezione 02 - DelegationMarco Bianchi
 
Lezione 08 - Iterator
Lezione 08 - IteratorLezione 08 - Iterator
Lezione 08 - IteratorMarco Bianchi
 
Lezione 12 - Observer
Lezione 12 - ObserverLezione 12 - Observer
Lezione 12 - ObserverMarco Bianchi
 
Java Unit Testing - JUnit (1)
Java Unit Testing - JUnit (1)Java Unit Testing - JUnit (1)
Java Unit Testing - JUnit (1)fgianneschi
 
PowerMock TDD User Group Milano
PowerMock TDD User Group MilanoPowerMock TDD User Group Milano
PowerMock TDD User Group MilanoMassimo Groppelli
 
Design Pattern Creazionali
Design Pattern CreazionaliDesign Pattern Creazionali
Design Pattern CreazionaliRiccardo Cardin
 
Lezione 13 - Strategy
Lezione 13 - StrategyLezione 13 - Strategy
Lezione 13 - StrategyMarco Bianchi
 
Lezione design patterns 2011 (Peron)
Lezione design patterns 2011 (Peron)Lezione design patterns 2011 (Peron)
Lezione design patterns 2011 (Peron)lukebonham
 
Scala: come recuperare la programmazione funzionale e perché
Scala: come recuperare la programmazione funzionale e perchéScala: come recuperare la programmazione funzionale e perché
Scala: come recuperare la programmazione funzionale e perchéEdmondo Porcu
 
Sistemi Context-aware: Esercitazione 4
Sistemi Context-aware: Esercitazione 4Sistemi Context-aware: Esercitazione 4
Sistemi Context-aware: Esercitazione 4Marco Loregian
 

Similaire à Lezione 01 - Singleton (20)

Lezione 11 - Bridge
Lezione 11 - BridgeLezione 11 - Bridge
Lezione 11 - Bridge
 
Design pattern template method
Design pattern template methodDesign pattern template method
Design pattern template method
 
Lezione 09 - Abstract Factory
Lezione 09 - Abstract FactoryLezione 09 - Abstract Factory
Lezione 09 - Abstract Factory
 
Lezione 04 - Factory method
Lezione 04 - Factory methodLezione 04 - Factory method
Lezione 04 - Factory method
 
Real Spring Aop Recipes For Your Everyday Job
Real Spring Aop Recipes For Your Everyday JobReal Spring Aop Recipes For Your Everyday Job
Real Spring Aop Recipes For Your Everyday Job
 
Lezione 02 - Delegation
Lezione 02 - DelegationLezione 02 - Delegation
Lezione 02 - Delegation
 
Lezione 08 - Iterator
Lezione 08 - IteratorLezione 08 - Iterator
Lezione 08 - Iterator
 
Lezione 12 - Observer
Lezione 12 - ObserverLezione 12 - Observer
Lezione 12 - Observer
 
Java Unit Testing - JUnit (1)
Java Unit Testing - JUnit (1)Java Unit Testing - JUnit (1)
Java Unit Testing - JUnit (1)
 
PowerMock TDD User Group Milano
PowerMock TDD User Group MilanoPowerMock TDD User Group Milano
PowerMock TDD User Group Milano
 
Design Pattern Creazionali
Design Pattern CreazionaliDesign Pattern Creazionali
Design Pattern Creazionali
 
Lezione 13 - Strategy
Lezione 13 - StrategyLezione 13 - Strategy
Lezione 13 - Strategy
 
Lezione design patterns 2011 (Peron)
Lezione design patterns 2011 (Peron)Lezione design patterns 2011 (Peron)
Lezione design patterns 2011 (Peron)
 
Eclipse and Java
Eclipse and JavaEclipse and Java
Eclipse and Java
 
Mini Corso Java - Parte 3
Mini Corso Java - Parte 3Mini Corso Java - Parte 3
Mini Corso Java - Parte 3
 
Java lezione1
Java lezione1Java lezione1
Java lezione1
 
Scala: come recuperare la programmazione funzionale e perché
Scala: come recuperare la programmazione funzionale e perchéScala: come recuperare la programmazione funzionale e perché
Scala: come recuperare la programmazione funzionale e perché
 
Sistemi Context-aware: Esercitazione 4
Sistemi Context-aware: Esercitazione 4Sistemi Context-aware: Esercitazione 4
Sistemi Context-aware: Esercitazione 4
 
Corso Java 1 - BASE
Corso Java 1 - BASECorso Java 1 - BASE
Corso Java 1 - BASE
 
Spring @Aspect e @Controller
Spring @Aspect e @Controller Spring @Aspect e @Controller
Spring @Aspect e @Controller
 

Plus de Marco Bianchi

Lezione 06 - Façade
Lezione 06 - FaçadeLezione 06 - Façade
Lezione 06 - FaçadeMarco Bianchi
 
Lezione 07 - Decorator
Lezione 07 - DecoratorLezione 07 - Decorator
Lezione 07 - DecoratorMarco Bianchi
 
Lezione 03 - Interface
Lezione 03 - InterfaceLezione 03 - Interface
Lezione 03 - InterfaceMarco Bianchi
 
Lezione 00 - Introduzione ai Design Patterns
Lezione 00 - Introduzione ai Design PatternsLezione 00 - Introduzione ai Design Patterns
Lezione 00 - Introduzione ai Design PatternsMarco Bianchi
 
Applicazioni del TAL e dell'Information retrieval nel settore giuridico
Applicazioni del TAL e dell'Information retrieval nel settore giuridicoApplicazioni del TAL e dell'Information retrieval nel settore giuridico
Applicazioni del TAL e dell'Information retrieval nel settore giuridicoMarco Bianchi
 

Plus de Marco Bianchi (6)

Lezione 05 - Proxy
Lezione 05 - ProxyLezione 05 - Proxy
Lezione 05 - Proxy
 
Lezione 06 - Façade
Lezione 06 - FaçadeLezione 06 - Façade
Lezione 06 - Façade
 
Lezione 07 - Decorator
Lezione 07 - DecoratorLezione 07 - Decorator
Lezione 07 - Decorator
 
Lezione 03 - Interface
Lezione 03 - InterfaceLezione 03 - Interface
Lezione 03 - Interface
 
Lezione 00 - Introduzione ai Design Patterns
Lezione 00 - Introduzione ai Design PatternsLezione 00 - Introduzione ai Design Patterns
Lezione 00 - Introduzione ai Design Patterns
 
Applicazioni del TAL e dell'Information retrieval nel settore giuridico
Applicazioni del TAL e dell'Information retrieval nel settore giuridicoApplicazioni del TAL e dell'Information retrieval nel settore giuridico
Applicazioni del TAL e dell'Information retrieval nel settore giuridico
 

Dernier

IL CHIAMATO ALLA CONVERSIONE - catechesi per candidati alla Cresima
IL CHIAMATO ALLA CONVERSIONE - catechesi per candidati alla CresimaIL CHIAMATO ALLA CONVERSIONE - catechesi per candidati alla Cresima
IL CHIAMATO ALLA CONVERSIONE - catechesi per candidati alla CresimaRafael Figueredo
 
biblioverifica ijf24 Festival Internazionale del Giornalismo 2024
biblioverifica ijf24 Festival Internazionale del Giornalismo 2024biblioverifica ijf24 Festival Internazionale del Giornalismo 2024
biblioverifica ijf24 Festival Internazionale del Giornalismo 2024Damiano Orru
 
Storia dell’Inghilterra nell’Età Moderna.pptx
Storia dell’Inghilterra nell’Età Moderna.pptxStoria dell’Inghilterra nell’Età Moderna.pptx
Storia dell’Inghilterra nell’Età Moderna.pptxOrianaOcchino
 
La seconda guerra mondiale per licei e scuole medie
La seconda guerra mondiale per licei e scuole medieLa seconda guerra mondiale per licei e scuole medie
La seconda guerra mondiale per licei e scuole medieVincenzoPantalena1
 
Terza cultura w la scienza Italo Calvino.pdf
Terza cultura w la scienza Italo Calvino.pdfTerza cultura w la scienza Italo Calvino.pdf
Terza cultura w la scienza Italo Calvino.pdfPierLuigi Albini
 
La produzione e la gestione degli Open Data
La produzione e la gestione degli Open DataLa produzione e la gestione degli Open Data
La produzione e la gestione degli Open DataGianluigi Cogo
 
Ticonzero news 148.pdf aprile 2024 Terza cultura
Ticonzero news 148.pdf aprile 2024 Terza culturaTiconzero news 148.pdf aprile 2024 Terza cultura
Ticonzero news 148.pdf aprile 2024 Terza culturaPierLuigi Albini
 
Esame finale - riunione genitori 2024.pptx
Esame finale - riunione genitori 2024.pptxEsame finale - riunione genitori 2024.pptx
Esame finale - riunione genitori 2024.pptxfedericodellacosta2
 

Dernier (8)

IL CHIAMATO ALLA CONVERSIONE - catechesi per candidati alla Cresima
IL CHIAMATO ALLA CONVERSIONE - catechesi per candidati alla CresimaIL CHIAMATO ALLA CONVERSIONE - catechesi per candidati alla Cresima
IL CHIAMATO ALLA CONVERSIONE - catechesi per candidati alla Cresima
 
biblioverifica ijf24 Festival Internazionale del Giornalismo 2024
biblioverifica ijf24 Festival Internazionale del Giornalismo 2024biblioverifica ijf24 Festival Internazionale del Giornalismo 2024
biblioverifica ijf24 Festival Internazionale del Giornalismo 2024
 
Storia dell’Inghilterra nell’Età Moderna.pptx
Storia dell’Inghilterra nell’Età Moderna.pptxStoria dell’Inghilterra nell’Età Moderna.pptx
Storia dell’Inghilterra nell’Età Moderna.pptx
 
La seconda guerra mondiale per licei e scuole medie
La seconda guerra mondiale per licei e scuole medieLa seconda guerra mondiale per licei e scuole medie
La seconda guerra mondiale per licei e scuole medie
 
Terza cultura w la scienza Italo Calvino.pdf
Terza cultura w la scienza Italo Calvino.pdfTerza cultura w la scienza Italo Calvino.pdf
Terza cultura w la scienza Italo Calvino.pdf
 
La produzione e la gestione degli Open Data
La produzione e la gestione degli Open DataLa produzione e la gestione degli Open Data
La produzione e la gestione degli Open Data
 
Ticonzero news 148.pdf aprile 2024 Terza cultura
Ticonzero news 148.pdf aprile 2024 Terza culturaTiconzero news 148.pdf aprile 2024 Terza cultura
Ticonzero news 148.pdf aprile 2024 Terza cultura
 
Esame finale - riunione genitori 2024.pptx
Esame finale - riunione genitori 2024.pptxEsame finale - riunione genitori 2024.pptx
Esame finale - riunione genitori 2024.pptx
 

Lezione 01 - Singleton

  • 3. Laboratorio Definire : • una classe PrintSpooler che: PrintSpooler – non ammette la contemporanea esistenza di due o più istanze; – contiene il metodo void stampa(String msg) • una classe con main(String[] arg) che tenta di ottenere il riferimento a due istanze printSpooler in due istruzioni consecutive • I risultati visualizzati: C:jdk1.4binjava SingleSpooler Opening one spooler printer opened Opening two spoolers Only one spooler allowed Ingegneria del Software - A.A. 2003/2004
  • 4. Soluzione exception based • Passo 1: la classe SingletonException //new exception type for singleton classes class SingletonException extends RuntimeException{ public SingletonException(){ super(); } public SingletonException(String s){ super(s); } } Ingegneria del Software - A.A. 2003/2004
  • 5. Soluzione exception based • Passo 2: la classe PrintSpooler class PrintSpooler { static boolean instance_flag=false; //true if 1 instance public PrintSpooler() throws SingletonException { if (instance_flag)throw new SingletonException(“Only one spooler allowed"); else instance_flag = true; //set flag for 1 instance System.out.println("spooler opened"); } public void finalize(){ instance_flag = false; //clear if destroyed } } Ingegneria del Software - A.A. 2003/2004
  • 6. Soluzione exception based • Passo 3: la classe singleSpooler public class SingleSpooler { singleSpooler static public void main(String argv[]){ PrintSpooler pr1, pr2; System.out.println("Opening one spooler"); try { pr1 = new PrintSpooler(); } catch(SingletonException e){…} System.out.println("Opening two spoolers"); try { pr2 = new PrintSpooler(); } catch(SingletonException e){…} } } Ingegneria del Software - A.A. 2003/2004
  • 7. Soluzione static class based • Classe PrintSpooler con tutti i metodi statici final class PrintSpooler { static public void print(String s){ System.out.println(s); } } StaticPrint public class staticPrint { public static void main(String argv[]){ PrintSpooler.print("here it is"); } } Ingegneria del Software - A.A. 2003/2004
  • 8. Soluzione static method based • Classe iSpooler con costruttore privato e metodo statico class iSpooler { static boolean instance_flag = false; private iSpooler() { } Costruttore privato static public iSpooler getInstance(){ if (! instance_flag){ instance_flag = true; Metodo statico return new iSpooler(); } else return null; } public void finalize(){ instance_flag = false;} } Ingegneria del Software - A.A. 2003/2004
  • 9. Confronto tra le soluzioni • Osservazioni alla soluzione exception based – Bisogna preoccuparsi di gestire le eccezioni – Fortemente legata al mondo Java – Rilascio “automatico” dello spooler non banale in Java • Soluzione static class based – Soluzione non scalabile • Souzione static method based – Rilascio “automatico” dello spooler non banale in Java (cfr. funzionamento del Garbage Collector) Ingegneria del Software - A.A. 2003/2004
  • 11. Il pattern Singleton (1/5) • Nome Singleton [GoF95] • Synopsis Il pattern Singleton garantisce che sia possibile creare una sola istanza della classe • Context - Classi che dovrebbero avere esattamente un’ istanza - Esempio: Classe che assicura che non sia riprodotto più di un brano musicale per volta. Questa classe dovrebbe sospendere l’esecuzione di un brano prima di iniziare a riprodurre il successivo. Ingegneria del Software - A.A. 2003/2004
  • 12. Il pattern Singleton (2/5) • Forces - Deve esistere esattamente un’istanza di una classe - L’unica istanza della classe deve essere accessibile a tutti i client di quella classe • Solution Una classe singleton ha: - una variabile statica privata che contiene il riferimento alla sua unica istanza - i costruttori privati - un metodo statico, tipicamente chiamato getInstance o getClassname, che ritorna il riferimento all’unica istanza Ingegneria del Software - A.A. 2003/2004
  • 13. Il pattern Singleton (3/5) Da Context a Solution Ingegneria del Software - A.A. 2003/2004
  • 14. Il pattern Singleton (4/5) • Consequences - Esiste esattamente un’istanza della classe - Per ottenere il riferimento dell’istanza le classi client devono invocare il metodo statico getInstance e non usare il costruttore - La specializzazione di una classe singleton è scomoda e genera classi imperfette dal punto di vista dell’incapsulamento. Problemi: - classi con costruttori privati non estendibili - metodi statici non riscrivibili Ingegneria del Software - A.A. 2003/2004
  • 15. Il pattern Singleton (5/5) • Implementation - Assicurarsi di dichiarare almeno un costruttore privato - Considerare il funzionamento del garbage collector ed utilizzare opportunamente il metodo finalize() • Java API usage - La classe java.lang.Runtime è una classe singleton (metodo statico getRuntime()) • Code example - Esercizio: scrivere il codice dell’esempio presentato in context • Related Patterns - cfr. Abstract Factory, Builder, Prototype Ingegneria del Software - A.A. 2003/2004