English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Analisi completa dei design pattern Java: il modello singleton

Questo articolo condivide l'esempio di codice del pattern Singleton del design pattern Java, per riferimento, il contenuto dettagliato è il seguente

Concetto:

Pattern Singleton: una classe ha un solo esempio.

Un'istanza di classe esiste e funziona unicamente, e fornisce un punto di accesso globale.

Le ragioni per utilizzare questo modello:

  Quando navighiamo sui siti web, alcuni di essi mostrano il numero di utenti attivi in questo momento. Di solito, per implementare questa funzione, ogni IP collegato viene memorizzato in una memoria, un file o un database, e ogni nuovo IP aggiunge uno alla conta. Generalmente, si utilizza un metodo come add() per implementare la funzione +1, ad esempio, utilizzando l'istruzione update per ottenere i dati memorizzati nel database, aggiungere 1 e aggiornare i dati nel database, quindi salvare; quando si visualizza nella pagina, è sufficiente utilizzare un altro metodo per ottenere i dati dal database. Tuttavia, quando più utenti accedono contemporaneamente, se ogni utente deve creare un nuovo oggetto e poi chiamare il metodo add() tramite 'oggetto.nomeMetodo', e poi memorizzare i dati nel database, ciò può portare a problemi per cui più utenti non possono registrare i dati degli utenti in modo accurato nel database. Pertanto, questo contatore è progettato come un oggetto globale (tutti utilizzano lo stesso oggetto, non uno nuovo), e tutti condividono la stessa copia dei dati, evitando così problemi simili, che è una delle applicazioni del pattern Singleton che chiamiamo. 

Analogamente, ci sono anche altre situazioni in cui si incontrano scenari simili, utilizzando idee simili. Ad esempio: }}

   1. Risorse esterne: Ogni computer ha più stampanti, ma può avere solo un PrinterSpooler per evitare che due job di stampa vengano inviati contemporaneamente alla stampante. Risorse interne: La maggior parte dei software ha uno (o più) file di proprietà per la configurazione del sistema, e tale sistema dovrebbe avere un oggetto che gestisce questi file di proprietà.
   2. Il Task Manager di Windows è un esempio molto tipico di modello singleton (è familiare, vero?). Pensa, puoi aprire due Task Manager di Windows? Non ci credi? Prova te stesso!
   3. La Recycle Bin di Windows è un'applicazione singleton tipica. Durante l'esecuzione del sistema, la Recycle Bin mantiene un'unica istanza.
   4. Il contatore del sito web di solito utilizza il modello singleton, altrimenti è difficile sincronizzare.
   5. L'applicazione del log dell'applicazione è generalmente implementata con il modello singleton, poiché il file di log condiviso è sempre aperto, poiché può esserci solo un'istanza che lo gestisce, altrimenti il contenuto non può essere aggiunto.
   6. La lettura dell'oggetto di configurazione dell'applicazione Web di solito utilizza il modello singleton, poiché il file di configurazione è una risorsa condivisa.
   7. Il design del pool di connessioni del database di solito utilizza il modello singleton, poiché la connessione del database è una risorsa del database. Nella software system del database, l'uso del pool di connessioni del database è principalmente per risparmiare l'efficienza di aprire o chiudere la connessione del database, che è molto costosa, poiché l'uso del modello singleton può ridurre significativamente questa perdita di efficienza.
   8. Il design del thread pool per la multithreading di solito utilizza il modello singleton, poiché il thread pool deve facilitare il controllo sui thread nel pool.
   9. Il file system dell'operating system è anche un esempio specifico di implementazione del modello singleton, poiché un sistema operativo può avere solo un file system.
   10. HttpApplication è un esempio tipico di applicazione singleton. Chi è familiare con l'intero ciclo di vita della richiesta di ASP.Net (IIS) dovrebbe sapere che HttpApplication è anche un modello singleton, e tutti i HttpModule condividono un'istanza di HttpApplication. 

In sintesi, le applicazioni generali del modello singleton sono:

    1. Oggetti che devono essere istanziati frequentemente e distrutti.

    2. Oggetti che richiedono molto tempo o risorse per creare, ma che vengono utilizzati frequentemente.

      3. Oggetti di strumenti con stato.

    4. Oggetti che accedono frequentemente al database o ai file.

    5. Evita le perdite di prestazioni o le perdite causate dalle operazioni sulle risorse, come i file di log, le configurazioni dell'applicazione.

    6. Facilita la comunicazione tra le risorse controllate, come i pool di thread.

Caratteristiche:

1. La classe singleton può avere solo una istanza

2. La classe singleton deve creare la propria istanza unica

3. La classe singleton deve fornire questa istanza a tutti gli altri oggetti

Elementi del modello singleton: 

   1. Costruttore privato
   2. Riferimento statico privato all'istanza
   3. Metodi pubblici statici che restituiscono l'istanza 

Ci sono tre metodi per implementare il modello singleton:

1. Modello hungry: l'istanza singleton viene costruita durante il caricamento della classe, con inizializzazione immediata (metodo di pre-caricamento).

/**
* Modello hungry (raccomandato)
*
*/
public class Test {
    private Test() {
    }
    public static Test instance = new Test();
    public Test getInstance() {
        return instance;
    }
}

Vantaggi 

    1. Sicurezza thread
    2. Un oggetto statico viene creato contemporaneamente con il caricamento della classe, e la reazione è veloce quando viene chiamato.

Svantaggi 

    L'efficienza delle risorse non è alta, potrebbe non essere mai eseguito getInstance(), ma se si eseguono altri metodi statici di questa classe o si carica questa classe (class.forName), l'istanza viene comunque inizializzata.

2. Modello lazy: l'istanza singleton viene costruita quando viene utilizzata la prima volta, con inizializzazione differita.

class Test {
    private Test() {
    }
    public static Test instance = null;
    public static Test getInstance() {
        if (instance == null) {
       //Quando più thread giudicano instance come null, durante l'esecuzione dell'operazione new, possono verificarsi casi di duplicazione.
            instance = new Singleton2();
        }
        return instance;
    }
}

Vantaggi 

    Evita di creare un'istanza come nel modello hungry senza usarla, con un'alta utilizzazione delle risorse, non viene creato l'istanza se non si esegue getInstance(), ma si possono eseguire altri metodi statici di questa classe.

Svantaggi 

    Il modello lazy non ha problemi in una singola thread, ma quando più thread accedono contemporaneamente, potrebbe creare più istanze contemporaneamente, e queste istanze non sono lo stesso oggetto, anche se le istanze create in seguito copriranno quelle create prima, ma ci sarà ancora la situazione di ottenere oggetti diversi. La soluzione a questo problema è aggiungere il lock synchronized, la prima volta che si carica non è abbastanza veloce, e l'uso delle synchonized nelle multi-thread è eccessivo in termini di overhead.

3. Doppio controllo

class Test {
    private Test() {
    }
    public static Test instance = null;
    public static Test getInstance() {
        if (instance == null) {
            synchronized (Test.class) {
                if (instance == null) {
                    instance = new Test();
                }
            }
        }
        return instance;
    }
}

Vantaggi 

    Alta utilizzazione delle risorse, senza eseguire getInstance() non viene istanziato, può eseguire altri metodi statici di questa classe

Svantaggi 

    La reazione non è abbastanza veloce durante il primo caricamento, a causa di alcuni motivi del modello di memoria Java occasionalmente fallisce

4. Classe interna statica

class Test {
    private Test() {
    }
    private static class SingletonHelp {
        static Test instance = new Test();
    }
    public static Test getInstance() {
        return SingletonHelp.instance;
    }
}

Vantaggi 

    Alta utilizzazione delle risorse, senza eseguire getInstance() non viene istanziato, può eseguire altri metodi statici di questa classe

Svantaggi 

    La reazione non è abbastanza veloce durante il primo caricamento

Conclusione: 

    Di solito si utilizza il metodo饿汉式,se si è molto attenti alle risorse, si può utilizzare la classe interna statica, non si raccomanda l'uso del metodo懒汉式 e il doppio controllo.

 Questo è tutto il contenuto dell'articolo, spero che sia utile per la tua apprendimento, e spero che tutti sosteniate e gridiate le lezioni.

Dichiarazione: il contenuto di questo articolo è stato tratto da Internet, il diritto d'autore è di proprietà del rispettivo proprietario, il contenuto è stato contribuito e caricato autonomamente dagli utenti di Internet, questo sito non possiede il diritto di proprietà, non è stato editato manualmente e non assume alcuna responsabilità legale correlata. Se trovi contenuti sospetti di copyright, sei invitato a inviare una e-mail a: notice#oldtoolbag.com (al momento dell'invio dell'e-mail, sostituisci # con @) per segnalare, fornendo prove pertinenti. Una volta verificata, questo sito eliminerà immediatamente il contenuto sospetto di violazione del copyright.

Ti potrebbe interessare