SlideShare uma empresa Scribd logo
1 de 16
Baixar para ler offline
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

Mais conteúdo relacionado

Semelhante a Lezione 01 - Singleton

Design pattern template method
Design pattern template methodDesign pattern template method
Design pattern template method
Nelson Firmani
 
Lezione 09 - Abstract Factory
Lezione 09 - Abstract FactoryLezione 09 - Abstract Factory
Lezione 09 - Abstract Factory
Marco Bianchi
 
Lezione 04 - Factory method
Lezione 04 - Factory methodLezione 04 - Factory method
Lezione 04 - Factory method
Marco Bianchi
 
Lezione 02 - Delegation
Lezione 02 - DelegationLezione 02 - Delegation
Lezione 02 - Delegation
Marco Bianchi
 
Lezione 08 - Iterator
Lezione 08 - IteratorLezione 08 - Iterator
Lezione 08 - Iterator
Marco Bianchi
 
Lezione 12 - Observer
Lezione 12 - ObserverLezione 12 - Observer
Lezione 12 - Observer
Marco Bianchi
 
Lezione 13 - Strategy
Lezione 13 - StrategyLezione 13 - Strategy
Lezione 13 - Strategy
Marco Bianchi
 
Lezione design patterns 2011 (Peron)
Lezione design patterns 2011 (Peron)Lezione design patterns 2011 (Peron)
Lezione design patterns 2011 (Peron)
lukebonham
 

Semelhante a 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
 

Mais 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
 

Último

Scienza Potere Puntoaaaaaaaaaaaaaaa.pptx
Scienza Potere Puntoaaaaaaaaaaaaaaa.pptxScienza Potere Puntoaaaaaaaaaaaaaaa.pptx
Scienza Potere Puntoaaaaaaaaaaaaaaa.pptx
lorenzodemidio01
 
case passive_GiorgiaDeAscaniis.pptx.....
case passive_GiorgiaDeAscaniis.pptx.....case passive_GiorgiaDeAscaniis.pptx.....
case passive_GiorgiaDeAscaniis.pptx.....
giorgiadeascaniis59
 
Presentazione tre geni della tecnologia informatica
Presentazione tre geni della tecnologia informaticaPresentazione tre geni della tecnologia informatica
Presentazione tre geni della tecnologia informatica
nico07fusco
 
Adducchio.Samuel-Steve_Jobs.ppppppppppptx
Adducchio.Samuel-Steve_Jobs.ppppppppppptxAdducchio.Samuel-Steve_Jobs.ppppppppppptx
Adducchio.Samuel-Steve_Jobs.ppppppppppptx
sasaselvatico
 
Nicola pisano aaaaaaaaaaaaaaaaaa(1).pptx
Nicola pisano aaaaaaaaaaaaaaaaaa(1).pptxNicola pisano aaaaaaaaaaaaaaaaaa(1).pptx
Nicola pisano aaaaaaaaaaaaaaaaaa(1).pptx
lorenzodemidio01
 

Último (20)

Scienza Potere Puntoaaaaaaaaaaaaaaa.pptx
Scienza Potere Puntoaaaaaaaaaaaaaaa.pptxScienza Potere Puntoaaaaaaaaaaaaaaa.pptx
Scienza Potere Puntoaaaaaaaaaaaaaaa.pptx
 
Una breve introduzione ad Elsa Morante, vita e opere
Una breve introduzione ad Elsa Morante, vita e opereUna breve introduzione ad Elsa Morante, vita e opere
Una breve introduzione ad Elsa Morante, vita e opere
 
Aristotele, vita e opere e fisica...pptx
Aristotele, vita e opere e fisica...pptxAristotele, vita e opere e fisica...pptx
Aristotele, vita e opere e fisica...pptx
 
Vuoi girare il mondo? educazione civica.
Vuoi girare il mondo? educazione civica.Vuoi girare il mondo? educazione civica.
Vuoi girare il mondo? educazione civica.
 
case passive_GiorgiaDeAscaniis.pptx.....
case passive_GiorgiaDeAscaniis.pptx.....case passive_GiorgiaDeAscaniis.pptx.....
case passive_GiorgiaDeAscaniis.pptx.....
 
Storia-CarloMagno-TeccarelliLorenzo.pptx
Storia-CarloMagno-TeccarelliLorenzo.pptxStoria-CarloMagno-TeccarelliLorenzo.pptx
Storia-CarloMagno-TeccarelliLorenzo.pptx
 
Tosone Christian_Steve Jobsaaaaaaaa.pptx
Tosone Christian_Steve Jobsaaaaaaaa.pptxTosone Christian_Steve Jobsaaaaaaaa.pptx
Tosone Christian_Steve Jobsaaaaaaaa.pptx
 
Presentazione tre geni della tecnologia informatica
Presentazione tre geni della tecnologia informaticaPresentazione tre geni della tecnologia informatica
Presentazione tre geni della tecnologia informatica
 
Adducchio.Samuel-Steve_Jobs.ppppppppppptx
Adducchio.Samuel-Steve_Jobs.ppppppppppptxAdducchio.Samuel-Steve_Jobs.ppppppppppptx
Adducchio.Samuel-Steve_Jobs.ppppppppppptx
 
Nicola pisano aaaaaaaaaaaaaaaaaa(1).pptx
Nicola pisano aaaaaaaaaaaaaaaaaa(1).pptxNicola pisano aaaaaaaaaaaaaaaaaa(1).pptx
Nicola pisano aaaaaaaaaaaaaaaaaa(1).pptx
 
CHIẾN THẮNG KÌ THI TUYỂN SINH VÀO LỚP 10 THPT MÔN NGỮ VĂN - PHAN THẾ HOÀI (36...
CHIẾN THẮNG KÌ THI TUYỂN SINH VÀO LỚP 10 THPT MÔN NGỮ VĂN - PHAN THẾ HOÀI (36...CHIẾN THẮNG KÌ THI TUYỂN SINH VÀO LỚP 10 THPT MÔN NGỮ VĂN - PHAN THẾ HOÀI (36...
CHIẾN THẮNG KÌ THI TUYỂN SINH VÀO LỚP 10 THPT MÔN NGỮ VĂN - PHAN THẾ HOÀI (36...
 
Oppressi_oppressori.pptx................
Oppressi_oppressori.pptx................Oppressi_oppressori.pptx................
Oppressi_oppressori.pptx................
 
ProgettoDiEducazioneCivicaDefinitivo_Christian Tosone.pptx
ProgettoDiEducazioneCivicaDefinitivo_Christian Tosone.pptxProgettoDiEducazioneCivicaDefinitivo_Christian Tosone.pptx
ProgettoDiEducazioneCivicaDefinitivo_Christian Tosone.pptx
 
TeccarelliLorenzo-Mitodella.cavernaa.pdf
TeccarelliLorenzo-Mitodella.cavernaa.pdfTeccarelliLorenzo-Mitodella.cavernaa.pdf
TeccarelliLorenzo-Mitodella.cavernaa.pdf
 
TeccarelliLorenzo-i4stilidellapitturaromana.docx
TeccarelliLorenzo-i4stilidellapitturaromana.docxTeccarelliLorenzo-i4stilidellapitturaromana.docx
TeccarelliLorenzo-i4stilidellapitturaromana.docx
 
Descrizione Piccolo teorema di Talete.pptx
Descrizione Piccolo teorema di Talete.pptxDescrizione Piccolo teorema di Talete.pptx
Descrizione Piccolo teorema di Talete.pptx
 
Esame di Stato 2024 - Materiale conferenza online 09 aprile 2024
Esame di Stato 2024 - Materiale conferenza online 09 aprile 2024Esame di Stato 2024 - Materiale conferenza online 09 aprile 2024
Esame di Stato 2024 - Materiale conferenza online 09 aprile 2024
 
Scrittura seo e scrittura accessibile
Scrittura seo e scrittura accessibileScrittura seo e scrittura accessibile
Scrittura seo e scrittura accessibile
 
discorso generale sulla fisica e le discipline.pptx
discorso generale sulla fisica e le discipline.pptxdiscorso generale sulla fisica e le discipline.pptx
discorso generale sulla fisica e le discipline.pptx
 
LE ALGHE.pptx ..........................
LE ALGHE.pptx ..........................LE ALGHE.pptx ..........................
LE ALGHE.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