Ciao a tutti, JavaRush!
Oggi vi parlerò del design pattern
Singleton
(singolo).
Obiettivo: creare una classe che avrà un solo oggetto. Ciò significa che non importa quante volte si accederà, verrà restituito lo stesso oggetto creato la prima volta. Questa è una cosa comoda e necessaria in molti luoghi, non per niente viene implementata nei framework.
Applicazione:
- Ad esempio, è necessario connettere un database a un progetto e una classe che sarà responsabile della connessione ad esso. La connessione viene creata una volta e non è necessario crearla ancora e ancora
Application settings
— una classe responsabile delle impostazioni di connessione necessarie per l'applicazione: host e porta del database, ecc. Vengono creati una volta e utilizzati durante il funzionamento dell'applicazione.
- Ci sono molti altri esempi che non ho menzionato, quindi scrivi le tue opzioni nei commenti! =)
Dopo questa introduzione, a quanto ho capito, possiamo mostrare un esempio di questa classe: (Anche se sono sicuro che ognuno di noi può inventarne un'implementazione) Ecco l'esempio più semplice, quando rendiamo privato il costruttore, cioè Non è possibile creare un oggetto in modo esplicito. Ed esiste un metodo statico
getInstance()
che fornisce un oggetto.
public class Singleton {
private static Singleton instance;
private Singleton () {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
Ci sono problemi con il multithreading e quindi puoi inserire un metodo
getInstance()
marker
synchronized
:
public class Singleton {
private static Singleton instance;
private Singleton () {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
Alla fine, come al solito, voglio dirti che se la pensi diversamente o trovi un errore in me, scrivilo nei commenti! Discuteremo di tutto con piacere :) Se ti è piaciuto l'articolo, scrivi "+" e lo saprò. Questo è importante per me :) PS Sto aggiungendo altre implementazioni: secondo
Joshua Bloch , questo è il modo migliore per implementare il modello
Enum Singleton
public enum Singleton {
INSTANCE;
}
Double Checked Locking & volatile
public class Singleton {
private static volatile Singleton instance;
public static Singleton getInstance() {
Singleton localInstance = instance;
if (localInstance == null) {
synchronized (Singleton.class) {
localInstance = instance;
if (localInstance == null) {
instance = localInstance = new Singleton();
}
}
}
return localInstance;
}
}
E inoltre
On Demand Holder idiom
:
public class Singleton {
public static class SingletonHolder {
public static final Singleton HOLDER_INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.HOLDER_INSTANCE;
}
}
+
Inizializzazione lenta
+
Prestazioni elevate
-
Non può essere utilizzato per campi di classe non statici Per eventuali domande/suggerimenti: scrivere nei commenti!
Vedi anche gli altri miei articoli:
GO TO FULL VERSION