El patrón Singleton es un patrón de diseño que garantiza que una clase solo tenga una única instancia en todo el ciclo de vida de la aplicación y proporciona un punto de acceso global a esa instancia. Este patrón es útil en escenarios donde una única instancia debe coordinar acciones a nivel global, como la conexión a una base de datos o un registro de logs.
El Singleton se implementa asegurando que el constructor de la clase sea privado, para evitar que otras clases puedan crear nuevas instancias. En su lugar, se proporciona un método estático que devuelve la única instancia de la clase.
public class Singleton {
// Se crea una instancia estática de la clase (de manera perezosa)
private static Singleton instancia;
// Constructor privado para evitar la creación de objetos externos
private Singleton() {
// Aquí puede ir el código de inicialización
}
// Método estático para obtener la instancia única
public static Singleton getInstancia() {
if (instancia == null) {
instancia = new Singleton();
}
return instancia;
}
}
1. Variable estática: instancia
es una variable estática que almacena la única instancia de la clase.
2. Constructor privado: El constructor es privado, lo que impide que otras clases creen nuevas instancias.
3. Método getInstancia()
: Este método es el encargado de devolver la instancia única. Si la instancia aún no ha sido creada, la inicializa. Esto asegura que solo exista una instancia de la clase.
Otra forma de implementar Singleton es utilizando la inicialización temprana. En este caso, la instancia se crea cuando se carga la clase, lo que puede ser útil si la creación del objeto es rápida y siempre se va a utilizar.
public class Singleton {
// Instancia única creada de inmediato al cargar la clase
private static final Singleton instancia = new Singleton();
// Constructor privado
private Singleton() {}
// Método estático que devuelve la instancia
public static Singleton getInstancia() {
return instancia;
}
}
En un entorno de múltiples hilos, es posible que más de un hilo intente crear la instancia de la clase al mismo tiempo. Para evitar esto, puedes usar sincronización:
public class Singleton {
private static Singleton instancia;
private Singleton() {}
// Método sincronizado para asegurar la seguridad en entornos multihilo
public static synchronized Singleton getInstancia() {
if (instancia == null) {
instancia = new Singleton();
}
return instancia;
}
}
Sin embargo, la sincronización puede afectar el rendimiento. Una solución más eficiente es el Double-Checked Locking, que reduce la sobrecarga:
public class Singleton {
private static volatile Singleton instancia;
private Singleton() {}
public static Singleton getInstancia() {
if (instancia == null) {
synchronized (Singleton.class) {
if (instancia == null) {
instancia = new Singleton();
}
}
}
return instancia;
}
}
El patrón Singleton es muy útil cuando necesitas controlar la creación de instancias en tu aplicación. Java ofrece varias maneras de implementarlo, desde una simple inicialización hasta enfoques más seguros para entornos multihilo.
Para obtener más detalles sobre patrones de diseño en Java, visita la documentación oficial de Oracle.
Jorge García
Fullstack developer