El patrón Singleton
Recordemos que los patrones de diseño describen un problema que puede ocurrir una y otra vez en nuestro entorno. También describen el núcleo de la solución a ese problema de una forma que puede usarse múltiples. Es decir, buscan solucionar un problema en un contexto específico.
En general, estos artículos sobre patrones de diseño se componen de cinco elementos: el nombre de patrón de diseño, el problema, la solución, las ventajas de usar este patrón y, por último, ejemplos de estos patrones en en diferentes lenguajes de programación.
En esta ocasión veremos el patrón de diseño de creación llamado Singleton.
Singleton
El patrón de diseño Singleton se utiliza para garantizar que una clase tenga solo una instancia y que se pueda acceder a ella globalmente. Este patrón es útil cuando solo se necesita una instancia de una clase en todo el sistema, como por ejemplo una base de datos.
El patrón Singleton se implementa utilizando una clase con un constructor privado que solo puede ser llamado internamente. La clase también debe tener una variable estática privada que almacena la única instancia de la clase. Se proporciona un método estático público para acceder a esta instancia.
Ventajas
Como consecuencia del uso del patrón Singleton tenemos los siguientes beneficios:
- Espacio de nombres reducido
El patrón Singleton es una mejora de las variables globales. Evita la contaminación del espacio de nombres con variables globales. - Refinamiento de representación y operación
Es poosible obtener subclases de una clase Singleton, y es fácil configurar una aplicación de una clase con su clase extendida. - Acceso controlado a una sola instancia
Como este patrón de diseño encapsula una sola instancia, se puede tener un control estricto sobre cómo y cuando el cliente tiene acceso a ésta. - Permite un número variable de instancias
Este patrón de diseño nos permite cambiar de opinión de manera simple y permitir más de una instancia de la clase Singleton. Incluso podemos controlar el número de instancias que puede usar la aplicación.
Ejemplos
Java
Veamos un ejemplo de implementación del patrón de diseño Singleton en Java:
public class Singleton {
private static Singleton instance = null;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
En este ejemplo, la clase Singleton
tiene un constructor privado y una variable estática privada instance
que es la única instancia de la clase. El método estático público getInstance
verifica si la instancia ya ha sido creada y la devuelve si ya existe o la crea si no.
Python
En Python, la implementación del patrón Singleton se puede hacer de la siguiente manera:
class Singleton:
__instance = None
def __init__(self):
if Singleton.__instance != None:
raise Exception("Ya existe una instancia de Singleton.")
else:
Singleton.__instance = self
@staticmethod
def getInstance():
if Singleton.__instance == None:
Singleton()
return Singleton.__instance
En este ejemplo, la clase Singleton
tiene un constructor que verifica si ya existe una instancia de la clase y lanza una excepción si ya existe. El método estático getInstance
devuelve la instancia única de la clase.
Go
En Go, que no tiene clases u objetos, el patrón Singleton se puede implementar usando estructuras.
package singleton
import "sync"
var instance *Singleton
var once sync.Once
type Singleton struct {
value int
}
func GetInstance() *Singleton {
once.Do(func() {
instance = &Singleton{value: 0}
})
return instance
}
En este ejemplo, la variable instance
es una instancia única de la estructura Singleton
que se crea utilizando la función once.Do
de la biblioteca sync
para asegurarse de que solo se cree una vez.
C#
En C#, la implementación del patrón Singleton
se puede hacer de la siguiente manera:
public sealed class Singleton
{
private static readonly Lazy<Singleton> lazy =
new Lazy<Singleton>(() => new Singleton());
public static Singleton Instance { get { return lazy.Value; } }
private Singleton() {}
}
En este ejemplo, la clase Singleton
utiliza la clase Lazy
de C# para garantizar que solo se cree una instancia de la clase. El método Instance
devuelve la única instancia de la clase.
En resumen, el patrón de diseño Singleton se utiliza para garantizar que solo se cree una instancia de una clase y que se pueda acceder a ella globalmente. Esta solución es útil cuando solo se necesita una instancia de una clase en todo el sistema. La implementación del patrón Singleton varía en diferentes lenguajes de programación, pero la idea básica es la misma.
Revisa el artículo Qué son los patrones de diseño para conocer otros los diferentes tipos de patrones de diseño.