¡Hola a todos, javaRush!
Hoy les hablaré sobre el patrón de diseño
Singleton
(sencillo).
Objetivo: crear una clase que tendrá solo UN objeto. Esto significa que no importa cuántas veces se acceda, se devolverá el mismo objeto que se creó la primera vez. Esto es algo conveniente y necesario en muchos lugares, no en vano se está implementando en marcos.
Solicitud:
- Por ejemplo, necesita conectar una base de datos a un proyecto y una clase que será responsable de conectarse a él. La conexión se crea una vez y no es necesario crearla una y otra vez.
Application settings
— una clase responsable de la configuración de conexión necesaria para la aplicación: host y puerto de la base de datos, etc. Se crean una vez y se utilizan durante todo el funcionamiento de la aplicación.
- Hay muchos más ejemplos que no he mencionado, ¡así que escribe tus opciones en los comentarios! =)
Después de esta introducción, según tengo entendido, puede mostrar un ejemplo de esta clase: (Aunque estoy seguro de que cada uno de nosotros puede idear una implementación de esto) Aquí está el ejemplo más simple, cuando hacemos que el constructor sea privado, es decir. No puede crear un objeto explícitamente. Y hay un método estático
getInstance()
que proporciona un objeto.
public class Singleton {
private static Singleton instance;
private Singleton () {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
Hay problemas con el subproceso múltiple y luego puedes poner un método
getInstance()
de marcador
synchronized
:
public class Singleton {
private static Singleton instance;
private Singleton () {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
Al final, como siempre, quiero decir que si piensas diferente o encuentras algún error en mí, ¡escribe en los comentarios! Hablaremos de todo con mucho gusto :) Si te gustó el artículo escribe “+” y lo sabré. Esto es importante para mí :) PD: Estoy agregando más implementaciones: según
Joshua Bloch , esta es la mejor manera de implementar la plantilla.
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;
}
}
Y además
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;
}
}
+
Inicialización diferida
+
Alto rendimiento
-
No se puede utilizar para campos de clase no estáticos. Cualquier pregunta/sugerencia: ¡escriba en los comentarios!
Vea también mis otros artículos:
GO TO FULL VERSION