Saltar al contenido
Portada » Patrón de diseño: Singleton

Patrón de diseño: Singleton

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ónDescripción
Factoría (Factory)Abstrae clientes de la instanciación de objetos de una librería.
ObserverDesacopla el sujeto de los observadores para notificar su estado.
SingletonComo tener una única instancia de una clase en memoria.
DecoratorAñadir responsabilidades a un objeto de forma dinámica.

Recursos Java

AsuntoDescripción
Tutorial básico y sintaxisTutorial 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 LambdaAquí te enseñamos las nociones más importantes para arrancas con funciones lambda
PalíndromosPrograma de ejemplo para el uso de palíndromos en Java.
Máquina Virtual de JavaTe explicamos el funcionamiento de la máquina virtual de java (Java Virtual Machine – JVM)
JDK, JRE y JVMDiferencias entre el JDK, JRE y JVM.
Mejores libros Java en EspañolHazte con los mejores libros Java para aprender paso a paso y profundizar en las mejores prácticas
TensorFlowManejo del API de TensorFlow para la construcción de grafos de operaciones y su ejecución
Tutorial Log4jTutorial para el manejo de Log4j, herramienta ágil y flexible para la gestión de Logs en Java
Java SecurityEntiende y aplica las posibilidades que da Java para mantener la seguridad
Tutorial JConsoleAprende los conceptos básicos de monitorización de procesos Java con JConsole
JavaFXTutorial de JavaFX, librería gráfica moderna para construcción de GUIs en móvil, escritorio y web.
Estructuras de datos en JavaExplicación y ejemplos de las estructuras de datos más importantes: listas, pila, cola, arbol.
JavaapiConjunto de clases, interfaces, métodos y paquetes que forman parte de la plataforma Java estándar
Algoritmo HuffmanMétodo eficiente para codificar datos, asignando códigos más cortos a los caracteres más frecuentes