
El patrón de diseño Singleton es uno de los más sencillos. En algunas ocasiones necesitamos tener una única instancia de una clase, por ejemplo una única conexión con la base de datos compartida por múltiples objetos. De manera similar también puede ser interesante una única instancia de gestor de configuraciones o gestor de errores.
Definición formal
El patrón Singleton es un patrón de diseño que restringe la instanciación de una clase a un único objeto.
Implementación Java
Implementación clásica
class Singleton
{
private static Singleton objetoUnico;
private Singleton() {}
public static Singleton obtenerInstancia()
{
if (objetoUnico == null)
objetoUnico = new Singleton();
return objetoUnico;
}
}
La declaración estática del método obtenerInstancia para que pueda ser invocado sin necesidad de instancia la clase.
El problema de este método es que no está protegido si varios hilos lo invocan.
Implementación con sincronización (thread safe)
class Singleton
{
private static Singleton objetoUnico;
private Singleton() {}
public static synchronized Singleton obtenerInstancia()
{
if (objetoUnico==null)
objetoUnico= new Singleton();
return objetoUnico;
}
}
De estar forma, usando synchronized nos aseguramos que un único hilo (thread) puede ejecutar a la vez el método obtenerInstancia(). La desventaja de este método es que el modificador synchronized es costoso y reduce el rendimiento del programa.
Instanciación impaciente
class Singleton
{
private static Singleton objetoUnico = new Singleton();
private Singleton() {}
public static Singleton obtenerInstancia()
{
return objetoUnico ;
}
}
Esta forma de instanciación es conveniente usarla cuando tu clase Singleton sea ligera y se use a lo largo de todo el programa.
El mejor método: doble comprobación de bloqueo
class Singleton
{
private static volatile Singleton objetoUnico = null;
private Singleton() {}
public static Singleton obtenerInstancia()
{
if (objetoUnico == null)
{
synchronized (Singleton.class)
{
if (objetoUnico == null)
objetoUnico = new Singleton();
}
}
return objetoUnico;
}
}
Este método reduce la sobrecarga de las llamadas al método synchronized cada vez.
Hazte con los mejores libros sobre patrones de diseño (design patterns)
Design Patterns: Elements of Reusable Object-Oriented Software – Erich Gamma

Patrones de diseño en Java. Los 23 modelos de diseño

Fácil Aprendizaje Patrones de Diseño Java

Más patrones de diseño
| Patrón | Descripción |
| Factoría (Factory) | Abstrae clientes de la instanciación de objetos de una librería. |
| Observer | Desacopla el sujeto de los observadores para notificar su estado. |
| Singleton | Como tener una única instancia de una clase en memoria. |
| Decorator | Añadir responsabilidades a un objeto de forma dinámica. |
Recursos Java
| Asunto | Descripción |
| Tutorial básico y sintaxis | Tutorial básico Java y sintaxis. Aprende los fundamentos del lenguaje. |
| Hilos (Threads) | Aprende a manejar hilos y las cuestiones básicas de la concurrencia |
| Funciones Lambda | Aquí te enseñamos las nociones más importantes para arrancas con funciones lambda |
| Palíndromos | Programa de ejemplo para el uso de palíndromos en Java. |
| Máquina Virtual de Java | Te explicamos el funcionamiento de la máquina virtual de java (Java Virtual Machine – JVM) |
| JDK, JRE y JVM | Diferencias entre el JDK, JRE y JVM. |
| Mejores libros Java en Español | Hazte con los mejores libros Java para aprender paso a paso y profundizar en las mejores prácticas |
| TensorFlow | Manejo del API de TensorFlow para la construcción de grafos de operaciones y su ejecución |
| Tutorial Log4j | Tutorial para el manejo de Log4j, herramienta ágil y flexible para la gestión de Logs en Java |
| Java Security | Entiende y aplica las posibilidades que da Java para mantener la seguridad |
| Tutorial JConsole | Aprende los conceptos básicos de monitorización de procesos Java con JConsole |
| JavaFX | Tutorial de JavaFX, librería gráfica moderna para construcción de GUIs en móvil, escritorio y web. |
| Estructuras de datos en Java | Explicación y ejemplos de las estructuras de datos más importantes: listas, pila, cola, arbol. |
| Javaapi | Conjunto de clases, interfaces, métodos y paquetes que forman parte de la plataforma Java estándar |
| Algoritmo Huffman | Método eficiente para codificar datos, asignando códigos más cortos a los caracteres más frecuentes |