Patrones de diseño - Singleton

El patrón Singleton es uno de los patrones más sencillos. Se encuentra dentro de los patrones creacionales ya que su objetivo es limitar que un objeto tenga una sola instancia y proporciona un método de acceso a esa instancia.

Necesidad

Necesitamos una clase que solo tenga una instancia. Existen casos en los que queremos que un objeto sea único y la mejor manera de hacerlo es hacer la propia clase responsable de mantener solo una instancia de sí misma.

La clase se asegura de que no se pueden crear otras instancias interceptando las peticiones de crear nuevos objetos pero tienen que proveer un método para que podamos acceder al objeto.

Implementación

Vamos a crear un clase ObjetoUnico. Esta clase tiene su constructor privado para que no se pueda instanciar con new y guarda una instancia privada de si misma.

La clase ObjetoUnico debe proveer un método estático para acceder a su instancia, que llamaremos getInstancia(). Si es la primera llamada al método se crea la instancia y se almacena localmente. En posteriores llamadas al método devolverá siempre la misma instancia local de la clase. El método tienen que ser estático ya que tiene que ser llamado sin instanciar la clase.

La clase también puede tener otros métodos que realicen funciones, en este caso vamos a crear un método llamado EjecutarTarea().

La representación de nuestra clase sería así:

Código en Vala

Esta es la clase que implementa el patrón singleton:

ObjetoUnico.vala
// Clase ObjetoUnico usando patrón sigleton  
 
public class ObjetoUnico : GLib.Object 
{ 
    private static ObjetoUnico instancia; 
     
    // El constructor privado evita poder instanciar 
    // la clase con new 
    private ObjetoUnico () {} 
     
    // Método para poder objtener la instancia 
    // Es static para poder acceder a él sin 
    // instancia de la clase 
    public static ObjetoUnico getInstancia () 
    { 
        // Si no existe la instancia la creamos una vez 
        if (instancia == null) 
            instancia = new ObjetoUnico (); 
        return instancia; 
    } 
     
    public void EjecutarTarea () 
    { 
        print ("Tarea de Objeto Unico\n"); 
    } 
} 

Cliente que utiliza la clase:

UsoPatronSingleton.vala
public class UsoPatronSingleton : GLib.Object 
{ 
    public static int main (string[] args) 
    { 
         
        // Si intentamos instanciar la clase ObjetoUnico fallará 
        // ObjetoUnico objetoU = new ObjetoUnico (); 
         
        // Para obtener el objeto usamos el método getInstancia  
        ObjetoUnico objetoU = ObjetoUnico.getInstancia (); 
         
        // Usamos los métodos que nos proporcione la clase 
        objetoU.EjecutarTarea (); 
             
        return 0; 
    } 
} 

Construimos y ejecutamos el programa:

❯ valac ObjetoUnico.vala UsoPatronSingleton.vala -o UsoPatronSingleton
❯ ./UsoPatronSingleton
Tarea de Objeto Unico

 

Indice de Patrones

Modificado por última vez enDomingo, 04 Octubre 2020 16:34
(3 votos)
Etiquetado como :

Deja un comentario

Asegúrese de introducir toda la información requerida, indicada por un asterisco (*). No se permite código HTML.