Patron Singleton Noria - tectijuana/javapdd16a-Archived GitHub Wiki

El patrón singleton

Es un patrón de diseño diseñado para restringir la creación de objetos pertenecientes a una clase o el valor de un tipo a un único objeto. Su intención consiste en garantizar que una clase sólo tenga una instancia y proporcionar un punto de acceso global a ella. El patrón singleton se implementa creando en nuestra clase un método que crea una instancia del objeto sólo si todavía no existe alguna. Para asegurar que la clase no puede ser instanciada nuevamente se regula el alcance del constructor (con modificadores de acceso como protegido o privado).

La instrumentación del patrón puede ser delicada en programas con múltiples hilos de ejecución. Si dos hilos de ejecución intentan crear la instancia al mismo tiempo y esta no existe todavía, sólo uno de ellos debe lograr crear el objeto. La solución clásica para este problema es utilizar exclusión mutua en el método de creación de la clase que implementa el patrón.

Las situaciones más habituales de aplicación de este patrón son aquellas en las que dicha clase controla el acceso a un recurso físico único (como puede ser el ratón o un archivo abierto en modo exclusivo) o cuando cierto tipo de datos debe estar disponible para todos los demás objetos de la aplicación.

Diagrama UML

El patrón singleton provee una única instancia global gracias a que:

  • La propia clase es responsable de crear la única instancia.
  • Permite el acceso global a dicha instancia mediante un método de clase.
  • Declara el constructor de clase como privado para que no sea instanciable directamente.

Sin embargo una clase que siga el patrón Singleton tiene la peculiaridad de que solo puede instanciar un único objeto .Este tipo de clases son habituales en temas como configurar parámetros generales de la aplicación ya que una vez instanciado el objeto los valores se mantienen y son compartidos por toda la aplicación. Vamos a configurar una clase con el patrón Singleton, a esta clase la llamaremos Configurador.

Singleton

Código utilizado

/** "Singleton" */ 
import java.util.*;
public class DocumentacionEnBlanco extends Documentacion
{
private static DocumentacionEnBlanco _instance = null;
private DocumentacionEnBlanco()
{
documentos = new ArrayList<Documento>();
}
public static DocumentacionEnBlanco Instance()
{
if (_instance == null)
_instance = new DocumentacionEnBlanco();
return _instance;
}

}

public class Comercial 
{
protected String nombre;
protected String direccion;
protected String email;
private static Comercial _instance = null;
private Comercial(){}
public static Comercial Instance() 
{
if (_instance == null)
_instance = new Comercial();
return _instance;
}
public void visualiza()
{
System.out.println("Nombre: " + nombre);
System.out.println("Dirección: " + direccion);
System.out.println("Email: " + email);
}
public String getNombre()
{
return nombre;
}
public void setNombre(String nombre)
{
this.nombre = nombre;
}
public String getDireccion()
{
return direccion;
}
public void setDireccion(String direccion)
{
this.direccion = direccion;
}
public String getEmail()
{
return email;
}
public void setEmail(String email)
{
this.email = email; 
}
}

public class TestComercial
{
public static void main(String[] args)
{   
// inicialización del comercial en el sistema
Comercial elComercial = Comercial.Instance();
elComercial.setNombre("Comercial Auto");
elComercial.setDireccion("Madrid");
elComercial.setEmail([email protected]");
// muestra el comercial del sistema
visualiza();
}
public static void visualiza()
{
Comercial elComercial = Comercial.Instance();
elComercial.visualiza();
} 
}

⚠️ **GitHub.com Fallback** ⚠️