Latest web development tutorials

Singleton pattern

Singleton (Singleton Pattern) Java è uno dei design pattern più semplice. Questo tipo di modelli di progettazione appartengono creare schema, che fornisce il modo migliore per creare oggetti.

Questo modello prevede una singola classe che è responsabile per la creazione di oggetti, garantendo nel contempo che solo un singolo oggetto viene creato. Questa classe fornisce un oggetto unico della loro visita, si può accedere direttamente, non è necessario creare un'istanza di un oggetto di quella classe.

Nota:

  • 1, classe singleton può avere una sola istanza.
  • 2, classe Singleton deve creare la propria istanza unica.
  • 3, classe Singleton deve fornire questo esempio per tutti gli altri oggetti.

introduzione

Intento: per garantire che una sola istanza di una classe, e fornire un punto di accesso globale per accedervi.

La soluzione principale: utilizzare una classe globale spesso creato e distrutto.

Quando usare: Quando si desidera controllare il numero di casi in cui, per risparmiare risorse di sistema.

Come risolvere: determinare se il sistema ha già questo singolo caso, se restituisce, se non poi creato.

Il codice chiave: il costruttore è privato.

Esempi di applicazione: 1, una parte può avere un solo presidente.2, Windows è un multi-processo, multi-filettato, nel funzionamento di un file quando inevitabilmente più processi o thread simultaneamente un documento del fenomeno, l'elaborazione di tutti i file deve essere effettuata da un caso unico. 3, alcuni dei manager attrezzature è spesso concepito come un modello single-caso, ad esempio un computer con due stampanti in uscita quando necessario per svolgere le due stampanti non possono stampare lo stesso file.

Vantaggi: 1, una sola istanza in memoria, riducendo la memoria luminosa, particolarmente frequenti creare e distruggere i casi (come la scuola di cache di pagina Gestione casa).2, per evitare altre persone nel resto delle risorse (come le operazioni di scrittura file).

Contro: senza interfaccia, non ereditano, e singola responsabilità principio di conflitto, una classe dovrebbe essere preoccupato per la logica interna unica, non all'esterno come il modo di istanziare.

scenari di utilizzo: 1, richiedono la produzione di un numero di serie unico.2, contatori web, non tutti i database a Riga una volta con un singolo caso per aggiornare cache. 3, un oggetto creato dalla necessità di un consumo eccessivo di risorse, come la connessione / O al database e così via.

Nota: getInstance () metodo richiede l'uso di sincronizzazione serratura sincronizzato (Singleton.class) per evitare che più thread nell'istanza causa è istanziato più volte.

realizzazione

Creeremo una classeSingleObject.ClasseSingleObjectha il suo costruttore privato e un'istanza statica.

ClasseSingleObjectfornisce un metodo statico per l'ottenimento di fuori del suo esempio statica.SingletonPatternDemo,i nostri corsi dimostrativi utilizzando classeSingleObjectottenere l'oggettoSingleObject.

pattern Singleton diagramma UML

fase 1

Creare una classe Singleton.

SingleObject.java

public class SingleObject {

   // Creare un oggetto SingleObject esempio SingleObject private static = new SingleObject ();

   // Fare costruttore privato, quindi la classe non verrà istanziato SingleObject privato () {}

   // Prendi il solo scopo di pubblica disponibile statica SingleObject getInstance () {
      tornare esempio;
   }

   showMessage public void () {
      System.out.println ( "Ciao Mondo!");
   }
}

fase 2

Ottenere oggetto unico dalla classe Singleton.

SingletonPatternDemo.java

public class SingletonPatternDemo {
   Main (string [] args) {public static void

      // // Costruttore illegale errore di compilazione: Costruttore SingleObject () non è visibile // SingleObject oggetto = new SingleObject ();

      // Ottenere l'oggetto disponibile SingleObject unico oggetto = SingleObject.getInstance ();

      // Visualizza messaggio object.showMessage ();
   }
}

fase 3

Verifica uscita.

Ciao a tutti!

Diversi implementazione pattern Singleton

Implementare pattern Singleton un certo numero di modi, come segue:

1, stile pigro, thread-safe

Sono inizializzazione differita: Sì

Sono sicuro multi-thread: No

Raggiungere Difficoltà: Facile

Descrizione: Questo metodo è il modo più semplice per ottenere questa implementazione il problema più grande non è il supporto multi-threading.Perché non c'è alcun blocco sincronizzato, in modo che il senso stretto non è un Singleton.
lazy loading in questo modo, ovviamente, non richiede la sicurezza dei thread, il lavoro in un ambiente multi-threaded non funziona.

esempi di codice:

public class Singleton {  
    esempio Singleton private static;  
    Singleton private () {}  
  
    public static Singleton getInstance () {  
    if (esempio == null) {  
        esempio = new Singleton ();  
    }  
    tornare esempio;  
    }  
}  

La prossima presentazione di diverse implementazioni supporta più thread, ma differiscono in termini di prestazioni.

2, stile pigro, thread-safe

Sono inizializzazione differita: Sì

Sono sicuro multi-thread: Sì

Raggiungere Difficoltà: Facile

Descrizione: in questo modo hanno una buona caricamento lazy, può funzionare bene in un multi-thread, tuttavia, è molto bassa efficienza, il 99% dei casi non richiede la sincronizzazione.
Vantaggio: La prima chiamata è stata inizializzata, per evitare sprechi di memoria.
Contro: devono essere bloccate sincronizzati per assicurare un singolo caso, ma la serratura influenzerà l'efficienza.
getInstance () la performance della domanda non è critica (che utilizzano meno frequentemente).

esempi di codice:

public class Singleton {  
    esempio Singleton private static;  
    Singleton private () {}  
    public static sincronizzato Singleton getInstance () {  
    if (esempio == null) {  
        esempio = new Singleton ();  
    }  
    tornare esempio;  
    }  
} 

3, formula di fame

Sono inizializzazione differita: No

Sono sicuro multi-thread: Sì

Raggiungere Difficoltà: Facile

Descrizione: E 'più comune, ma incline a oggetti spazzatura.
Vantaggi: non bloccato, l'efficienza è migliorata.
Svantaggi: class loader è inizializzato, la memoria è sprecato.
Si basa sul meccanismo classloder evita multithreading sincronizzazione, tuttavia esempio quando viene istanziata class loader, anche se la classe causa caricamento di una varietà di ragioni, la maggior parte del pattern Singleton è chiamare il metodo getInstance, ma non può essere determinato ci sono altri modi (o altri metodi statici) porta alla classe di carico, questa volta non sembravano aver raggiunto l'inizializzazione esempio effetto caricamento pigro.

esempi di codice:

public class Singleton {  
    static esempio privato Singleton = new Singleton ();  
    Singleton private () {}  
    public static Singleton getInstance () {  
    tornare esempio;  
    }  
}  

4, serratura a doppia-check / doppio blocco di controllo (DCL, che è interblocco ricontrollato)

versione JDK: jdk1.5 da

Sono inizializzazione differita: Sì

Sono sicuro multi-thread: Sì

Realizzare la difficoltà: più complessa

Descrizione: Questo metodo utilizza meccanismo di blocco doppio, sicurezza e, nel caso del multi-threading per mantenere elevate prestazioni.
getInstance () le prestazioni delle applicazioni è critica.

esempi di codice:

public class Singleton {  
    privato volatili statica Singleton Singleton;  
    Singleton private () {}  
    public static Singleton getSingleton () {  
    if (Singleton == null) {  
        sincronizzato (Singleton.class) {  
        if (Singleton == null) {  
            Singleton = new Singleton ();  
        }  
        }  
    }  
    tornare Singleton;  
    }  
}  

5, tipo di registrazione / classi statiche interne

Sono inizializzazione differita: Sì

Sono sicuro multi-thread: Sì

Realizzare la difficoltà: Generale

Descrizione: Questo metodo può raggiungere la modalità di blocco doppio controllo stesso effetto, ma l'implementazione più facile.Utilizzare l'inizializzazione pigra di campo statico deve essere utilizzato in questo modo, invece di controllare due volte la modalità di blocco. Questo vale solo per il caso di un campo statico, controllare la modalità di blocco può essere utilizzato in caso di necessità di ritardo per inizializzare campi di istanza.
Questo approccio sfrutta anche meccanismi classloder per garantire che solo un thread esempio di inizializzazione, è con 3 modi diversi è: fino a quando la terza via della classe Singleton viene caricata, l'istanza viene creata un'istanza (lazy loading non raggiunto effetto), ma questo approccio è di classe Singleton è caricato, istanza non può essere inizializzato. Poiché classe SingletonHolder non viene utilizzato attivamente, visualizzati solo attraverso la chiamata al metodo getInstance, appare caricato classe SingletonHolder, che viene istanziato esempio. Immaginate, se si crea un'istanza di un'istanza di risorse ad alta intensità, così ha voluto ritardare il caricamento, d'altra parte, quando non si vuole creare un'istanza della classe Singleton loader, perché non può garantire classe Singleton può anche essere attivo in altre aree in modo da essere caricato, questa volta per istanziare esempio chiaramente inadeguato. Questa volta, in questo modo rispetto ai primi tre tipi di modi è molto ragionevole.

esempi di codice:

public class Singleton {  
    privato classe statica SingletonHolder {  
    private static finale Singleton GRADO = new Singleton ();  
    }  
    Singleton private () {}  
    public static finale Singleton getInstance () {  
    tornare SingletonHolder.INSTANCE;  
    }  
}   

6, enumerare

versione JDK: jdk1.5 da

Sono inizializzazione differita: No

Sono sicuro multi-thread: Sì

Raggiungere Difficoltà: Facile

Descrizione: Questa implementazione non è ancora stato ampiamente adottato, ma questo è il modo migliore per attuare pattern Singleton.E 'più conciso, meccanismo automatico supporto di serializzazione per evitare più istanze del assoluta.
Questo approccio è efficace Java autore Josh Bloch sostiene un modo che può non solo evitare i problemi di sincronizzazione multi-thread, ma anche supporta automaticamente meccanismo di serializzazione per evitare deserializzazione ri-creare un nuovo oggetto, assolutamente evitare di istanze multiple. Tuttavia, dal momento che solo uniti dopo jdk1.5 proprietà enum, scrivere in questo modo non può fare a meno di sentirsi strano, in pratica, raramente utilizzato.
Non da un attacco di riflessione per chiamare il costruttore privato.

esempi di codice:

enum pubblico Singleton {  
    GRADO;  
    whateverMethod public void () {  
    }  
}  

Regola generale: In circostanze normali, non raccomanda l'uso del primo tipo e il secondo tipo modo pigro, si consiglia di utilizzare terza via un uomo affamato.Solo quando si desidera implementare effetto lazy loading è chiaro, useremo i primi cinque tipi di modalità di registrazione. Se si tratta di deserializzare oggetti per creare, si può provare a utilizzare la modalità di enumerazione sesta. Se avete altre esigenze particolari, si può considerare l'utilizzo di una quarta doppio controllo la modalità di blocco.