Creational Design Pattern: 1. Pattern Singleton

Che cosè un design pattern creazionale?

(26 dicembre 2020)

I design pattern creazionali si occupano della creazione o della clonazione di nuovi oggetti di una classe. La clonazione si verifica quando esiste già un tipo simile di oggetto e invece di istanziare un nuovo oggetto, cloniamo quello esistente.

I diversi modi di creare oggetti influenzeranno notevolmente il modo in cui un problema viene risolto. Linguaggi differenti hanno quindi un impatto sui pattern che è possibile utilizzare.

Pattern Singleton

Il pattern Singleton viene utilizzato quando si richiede solo una singola istanza di una classe. Ad esempio, effettuando una connessione DB in unapplicazione, coda di stampa della stampante, utilizzando i logger in quanto richiedono molte risorse. In tutti questi casi, se ci sono più istanze, creerà confusione e incongruenza.

Questo modello viene utilizzato quando listanza è condivisa e accessibile globalmente attraverso lapplicazione. Assicurarsi che laccesso alle risorse condivise sia thread-safe è un ottimo esempio di dove questo tipo di pattern può essere vitale. lo scopo di un pattern Singleton è fornire laccesso globale a una classe limitata a unistanza.

Vediamo come viene creato loggetto

public class DummyClass{ DummyClass(){}
}DummyClass dc = new DummyClass(); //every time when this line is called a new object of DummyClass is created

Ora, ogni volta che è necessario un oggetto di DummyClass, viene chiamato il suo costruttore e viene creato un oggetto. Questa è chiamata inizializzazione Eager.

Ma, nel pattern singleton, abbiamo bisogno solo di una singola istanza di una classe. Supponiamo che se una connessione DB è già configurata, non è necessario creare una nuova connessione DB e dovremmo utilizzare la connessione già esistente. Vediamo come ottenerlo.

Qui, abbiamo limitato lambito del costruttore alla classe stessa. Quindi, per creare loggetto di questa classe, deve essere chiamato il metodo statico getDBConnection () della classe. Quindi controllerà se loggetto dbConnection è nullo, quindi creerà un nuovo oggetto connessione e restituirà altrimenti restituirà loggetto connessione esistente.

Questo esempio mostra il concetto di inizializzazione lenta . Ciò significa che non stiamo creando loggetto della classe a meno che non sia veramente necessario. Quindi, questo programma è più efficiente in termini di risorse.

Il principio di progettazione Singleton presenta dei compromessi. Se sono in esecuzione più thread di elaborazione, potrebbero esserci problemi causati dai thread che tentano di accedere al singolo oggetto condiviso.

Problemi nellimplementazione precedente

Ora, è possibile che due i thread contemporaneamente chiamano il metodo getDBConnection e loggetto non è ancora stato creato. Per entrambi i thread, loggetto dbConnection sarà null ed entrambi cercheranno di creare una nuova istanza e di utilizzarla invece. È quindi molto importante assicurarsi che un singolo thread possa accedere a getDBConnection alla volta in modo che non vengano create più istanze.

Per ottenere un thread -safe classe singleton serve a sincronizzare il metodo di accesso globale, in modo che solo un thread possa eseguire questo metodo alla volta.

Solo un thread alla volta può accedere a questo blocco di codice sincronizzato

Potresti pensare che il problema sia risolto ora. Ma sfortunatamente no! Per applicare la proprietà singleton abbiamo messo un blocco sul metodo statico getDBConnection, ma allo stesso tempo compromettendone le prestazioni. Quando un oggetto è già stato creato, anche più thread devono attendere per ottenere listanza esistente di quelloggetto. Possiamo fare qualcosa di meglio? Vediamo.

Come è evidente, il blocco è richiesto solo quando listanza è nulla, in modo che thread diversi non creino più istanze. Quindi, possiamo inserire una condizione sincronizzata allinterno della condizione if in cui stiamo controllando se listanza è nulla o meno e aggiungere un doppio controllo per eliminare gli scenari di più istanze.

Nelluso reale, il pattern singleton può essere implementato in modi diversi. Definisce solo lo scopo di base di questo modello, ma limplementazione del codice può essere diversa.

È tutto da parte mia. Spero sia chiaro ora dove, quando e come utilizzare il modello di progettazione singleton. Puoi fare riferimento al libro, il catalogo del design pattern di Gang of Four per una maggiore comprensione.

Per favore fatemelo sapere nei commenti qui sotto, se avete dei dubbi. Se ti piace questo blog, condividilo con i tuoi amici. Buona ingegneria del software!

Parte 2: