Patrón Singleton
Este patrón se ve asociado a la palabra único, ya que este du diseño así lo amerita, una única instancia de un objeto. Algunas de las propiedas de este patrón:
• Garantiza que una clase sólo tenga una instancia.
• Proporciona un punto de acceso global a dicha instancia.
• Trabaja mediante un método especial que se utiliza para instanciar el objeto.
Cuando el método es llamado, revisa si ya existe otro objeto instanciado. Si ya existe, retorna una referencia al objeto, sino, el método crea la instancia y retorna la referencia a esa nueva instancia. Es decir:
• En esencia, la idea es que cada objeto en la aplicación use la misma instancia de Singleton.
• Esto evita tener que pasar la instancia a todos los objetos que quieran utilizarla.
• El patrón Singleton hace a los objetos responsables de sí mismos.
Ejemplo
Supones que hay una aplicación que simula a tres estudiantes pintan sobre un mismo lienzo, cada uno de los estudiantes harian un total de tres instancias (new Estudiante()) y una única instancia de lienzo (new Lienzo()). Por qué una instancia de lienzo y no tres? porque los tres estudiantes deben compartir el mismo lienzo, es decir, los tres pintan el mismo lienzo al mismo, eso si, puede ser que los tres pinten el lienzo al mismo tiempo, o que cada uno pinte cuando quiera.
Según la descripción de la aplicación prodríamos hacer la instancia de un lienzo y darle ese mismo lienzo a los tres estudiantes, eso sería lo común suponiendo que la clase Lienzo tiene color y la clase Estudiante tiene carnet.
Lienzo lienzo = new Lienzo("blanco");
Estudiante est_1 = new Estudiante(001, lienzo);
Estudiante est_2 = new Estudiante(002, lienzo);
Estudiante est_3 = new Estudiante(003, lienzo);
est_1.pintar("verde");
est_1.pintar("azul");
est_1.pintar("rojo");
El código anterio está implementado de la forma “convencional”, pero esto tiene sus consecuencias, ya que el objeto Lienzo puede ser altera con libertad y claro está que nadie tiene control sobre ese objeto, es decir, cualquier puede darle al objeto Lienzo el valor y las cantidad de instancias sin llevar un control del mismo. Para evitar esto, se aplica el patron Singleton:
public class Lienzo(){
public Static Lienzo LIENZO_COMPARTIDO = null;
private String color;
private Lienzo(){
this.color = "blanco";
}
public synchronize static Lienzo getInstancia(){
if (LIENZO_COMPARTIDO == null) LIENZO_COMPARTIDO = new Lienzo();
return LIENZO_COMPARTIDO;
}
public void pintar(String color){
this.color = color;
}
}
La variable public <strong>LIENZO_COMPARTIDO</strong> va a ser la que permita el la interacción entre las las demas clases de la aplicación y la instancia de el Lienzo, hay que destacar que el constructor se declara privado, asi se evita instancias descontroladas del Lienzo.
El método <strong>public synchronize static Lienzo getInstancia()</strong> es el encargado de dar la única instancia del Lienzo, éste verifica si ya hay una instancia creada y si ya la hay entonces la retorna, manteniendo asi una única declaración.
Reconstruyendo el primer código de ejemplo, junto con el anterior, quedaría:
Estudiante est_1 = new Estudiante(001);
Estudiante est_2 = new Estudiante(002);
Estudiante est_3 = new Estudiante(003);
est_1.pintar("verde");
est_1.pintar("azul");
est_1.pintar("rojo");
//metodo pintar de la clase Estudiante
public void pintar(String color){
Lienzo.gertInstancia().pintar(color);
}
Ya los estudiantes de igual forma pueden pintar el lienzo sin necesidad de tener el mismo lienzo cada uno de ellos, es en el metodo pintar de la clase Estudiante donde se nota el comportamiento del patron Singleton.