Está en la página 1de 11

Patrn de Diseo

Singleton
Tecnologa de Programacin I

[Escriba aqu una descripcin breve del documento. Normalmente, una
descripcin breve es un resumen corto del contenido del documento. Escriba aqu
una descripcin breve del documento. Normalmente, una descripcin breve es un
resumen corto del contenido del documento.]


2013
Universidad Nacional de Trujillo
21/10/2013
INTEGRANTES
GUARNIZ CUEVA, Milagros
LUIS GOMEZ, Joel
MORALES CASTILLO, Karolayn
ROJAS GUEVARA, Remso
VERDE IBAEZ, Richard


1
Contenido
Introduccin ......................................................................................................................................................... 2
Instancia nica (Singleton) ............................................................................................................................... 2
Discusin .......................................................................................................................................................... 3
Singletonitis ..................................................................................................................................................... 3
Significado de la palabra Singleton ............................................................................................................ 3
Ejemplo sencillo: implementacin del GoF .............................................................................................. 4
La fbrica de chocolate ...................................................................................................................................... 5
Convertir chocolaboiler a singleton................................................................................................................ 6
Problemas en ambientes multihilo ................................................................................................................. 6
Tratar con multithreading (multihilo) ............................................................................................................ 7
Usar "bloqueo doble comprobacin" ........................................................................................................... 8
Resumen ............................................................................................................................................................... 8












2
Patron de diseo Singleton
Introduccin
Objetos generalmente pueden actuar de manera responsable con slo realizar su propio trabajo
en sus propios atributos, sin incurrir en obligaciones ms all de auto- consistencia. Algunos
objetos, sin embargo, asumen ms responsabilidades, como el modelado de entidades del mundo
real, la coordinacin de trabajo, o modelar el estado general de un sistema. Cuando un objeto
determinado en un sistema tiene una gran responsabilidad en la que otros objetos se basan, usted
necesita una manera de encontrar el objeto responsable. Por ejemplo, es posible que
Que encontrar un objeto que representa una determinada mquina o un objeto de cliente que
puede construirse a partir de los datos de una base de datos o un objeto que se inicia la
recuperacin de la memoria del sistema.
Cuando usted necesita para encontrar un objeto responsable, el objeto que se necesita, en
algunos casos, la nica instancia de su clase. Por ejemplo, en Oozinoz , en la actualidad slo una
fbrica y slo un objeto Factory. En este caso, es necesario SINGLETON . La intencin del patrn
Singleton es asegurar que una clase tiene slo una instancia y proporcionar un punto de acceso
global a ella.
Instancia nica (Singleton)

La instancia nica parte de la necesidad de permitir una y sola una instancia de alguna clase en
especfico, esto se logra permitiendo que sea la propia clase la encargada de garantizar la
existencia de una nica clase.
Las instancias nicas son necesarias a medida en que un objeto debe controlar el acceso a un
nico recurso como un archivo abierto en modo exclusivo, o bien un caso tpico como la conexin
a una base de datos.
La implementacin general de este patrn se logra creando la instancia de la clase por medio de
un mtodo de ella misma y el acceso a los constructores de la misma es regulado por medio de
atributos como privado. En java, una implementacin correcta de singleton es la propuesta por Bill
Pugh:

public class Singleton {
private Singleton() {}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
private static class SingletonHolder {
private final static Singleton instance = new Singleton();
}
}

Existen otras variantes de esta implementacin en especial, por el tema de la
concurrencia, sistemas multi-hilos. Pero la esencia del patrn no se degrada.

3
Discusin

El patrn Singleton asegura que exista una nica instancia de una clase. A primera vista, uno
puede pensar que pueden utilizarse clases con miembros estticos para el mismo fin. Sin embargo,
los resultados no son los mismos, ya que en este caso la responsabilidad de tener una nica
instancia recae en el cliente de la clase. El patrn Singleton hace que la clase sea responsable de su
nica instancia, quitando as este problema a los clientes.
Adicionalmente, si todos los mtodos de esta clase son estticos, stos no pueden ser extendidos,
desaprovechando as las capacidades polimrficas que nos proveen los entornos orientados a
objetos.
El funcionamiento de este patrn es muy sencillo y podra reducirse a los siguientes conceptos:

1. Ocultar el constructor de la clase Singleton, para que los clientes no puedan crear
instancias.
2. Declarar en la clase Singleton una variable miembro privada que contenga la referencia a
la instancia nica que queremos gestionar.
3. Proveer en la clase Singleton una funcin o propiedad que brinde acceso a la nica
instancia gestionada por el Singleton. Los clientes acceden a la instancia a travs de esta
funcin o propiedad.

Estas reglas se cumplen en todas las implementaciones del Singleton, independientemente de los
recaudos que deban tomarse para soportar la correcta ejecucin en entornos multihilo.
El ciclo de vida de los Singleton es un aspecto importante a tener en cuenta. En Patterns Hatching
[Vlissides98] John Vlissides se plantea y estudia en profundidad el problema de "quin y cmo
mata a un Singleton?", bajo el sugerente ttulo de "To Kill a Singleton".
Singletonitis

En Refactoring to Patterns se presenta el trmino Singletonitis, refirindose a "la adiccin al
patrn Singleton". Este trmino aparece en la motivacin del refactoring "Inline Singleton", cuyo
objetivo es remover los Singletons innecesarios en una aplicacin. Dado que el Singleton es quizs
el patrn ms sencillo del GoF a veces es sobreutilizado y muchas veces en forma incorrecta.
Esto no quiere decir que Singleton sea malo y no hay que usarlo. Pero como todo, debe utilizarse
en su justa medida y en el contexto adecuado.

Significado de la palabra Singleton
Como curiosidad es interesante mencionar que la palabra singleton significa en ingls "un
conjunto que contiene un solo miembro".





4
Ejemplo sencillo: implementacin del GoF
Esta forma de implementacin es la que se presenta en el libro Design Patterns y es quizs la ms
sencilla de todas. En el bloque de cdigo a continuacin se muestra una traduccin literal del
ejemplo del GoF .






public class Singleton {
private static uniqueInstance Singleton;
// Otras variables de instancia til aqu
private Singleton () {}
public static Singleton getInstance () {
if (uniqueInstance == null) {
uniqueInstance = new Singleton ();
}
return uniqueInstance;
}
// Otros mtodos tiles aqu








if (uniqueInstance == null) {
uniqueInstance = new Singleton ();
}
return uniqueInstance;





... y, si no existe, creamos una
instancia Singleton a travs de
su constructor privado y
asignarlo a uniqueInstance.
Tenga en cuenta que si nunca
necesitamos la instancia, nunca
se crea, lo que es la creacin de
instancias perezosa.
Si uniqueInstance no era
nulo, que fue creada
anteriormente. Acabamos
de caer por de la
instruccin return..
Cuando llegamos a este
cdigo, tenemos una
instancia y la devolvemos.

5
La fbrica de chocolate
Todo el mundo sabe que todas las fbricas de chocolate modernos tienen calderas de chocolate
controlados por el ordenador. El trabajo de la caldera es tomar el chocolate y la leche, los lleva a
un hervor y luego pasarlos a la siguiente fase de la fabricacin de barras de chocolate.
Esta es la clase de controlador para uso industrial caldera del chocolate fuerza Choc-O-Holic, Inc.
's. Echa un vistazo al cdigo, te dars cuenta de que han tratado de ser muy cuidadoso para
asegurar que las cosas malas no ocurren, como el drenaje 500 galones de mezcla sin hervir, o
llenar la caldera cuando est ya lleno, o hervir la caldera vaca!


public class ChocolateBoiler {
private boolean empty;
private boolean boiled;

private ChocolateBoiler() {
empty = true;
boiled = false;
}
v
public void fill() {
if (isEmpty()) {
empty = false;
boiled = false;
// llenar la caldera con una mezcla de leche / chocolate
}
}
public void drain() {
if (!isEmpty() && isBoiled()) {
// drenar la leche hervida y chocolate
empty = true;
}
}
public void boil() {
if (!isEmpty() && !isBoiled()) {
// llevar el contenido a ebullicin
boiled = true;
}
}
public boolean isEmpty() {
return empty;
}
public boolean isBoiled() {
return boiled;
}
}





Para llenar la caldera debe
estar vaco, y, una vez que
est completo, nos
pusimos las banderas vacas
y se hierve.
Este cdigo slo se
inicia cuando la caldera
est vaca!
Para vaciar la caldera, debe
estar llena (no vaca) y hervida.
Una vez que se drena fijamos
vaca de nuevo a true. Este
cdigo slo se inicia cuando la
caldera est vaca!
Para hervir la mezcla, la
caldera tiene que ser completa
y ya no hervida. Una vez que
se hierve ponemos la bandera
hervida en true.

6
Convertir chocolaboiler a singleton

public class ChocolateBoiler {
private boolean empty;
private boolean boiled;
private static ChocolateBoiler uniqueInstance;
private ChocolateBoiler() {
empty = true;
boiled = false;
}

public static ChocolateBoiler getInstance() {
if (uniqueInstance == null) {
uniqueInstance = new ChocolateBoiler();
}
return uniqueInstance;
}
public void fill() {
if (isEmpty()) {
empty = false;
boiled = false;
// }
}
// resto de cdigo ChocolateBoiler ...
}
Problemas en ambientes multihilo
Si estamos en un ambiente de un solo hilo (single-thread) esta implementacin es suficiente. En
contrapartida, tiene serios problemas en entornos multihilo (multi-thread) dado que, debido a
cuestiones de sincronizacin y concurrencia, puede crearse ms de una instancia del miembro
instance. Cmo puede ser esto posible? Imaginemos que dos hilos evalan la condicin instance
== null y en ambos casos es verdadera. En este caso, ambos hilos crearn la instancia, violando el
propsito del patrn Singleton.
Ahora bien, Es esto un problema? Puede o no serlo... [DPE01]
Si el Singleton es absolutamente stateless (es decir, no mantiene ningn tipo de estado)
puede no ser un problema.
Si el Singleton mantiene estado se pueden producir errores sutiles. Por ejemplo, si se
modifica el estado del objeto en el constructor, pueden producirse inconsistencias, dado
ese cdigo de inicializacin se ejecuta ms de una vez.
o Tomemos como ejemplo de esto ltimo un Singleton que implementa un
contador. Imaginemos que el constructor inicializa el contador a 0. Si se producen
dos creaciones, se inicializar dos veces el contador. Quizs en la segunda
inicializacin, una instancia ya haba incrementado su contador, pero debido a la
ejecucin de ese cdigo de inicializacin, ese incremento se perder.
Los problemas que se producen a raz de esto pueden ser muy difciles de detectar. La creacin
dual suele producirse en forma intermitente e incluso puede no suceder (no es determinista).
En el cuadro se ilustra una de las formas en que puede presentarse este problema, usando como
base el ejemplo presentado en el cdigo anterior. En este caso, dos hilos solicitan la instancia a
travs de la funcin GetInstance, pero sta todava no ha sido creada. Por lo tanto, en los dos
casos se procede a la creacin de la nica instancia.

7
Las dos columnas a la izquierda (Thread 1 y Thread 2) representan los hilos de ejecucin y
muestran el cdigo Java que se ejecuta en cada momento. La columna de la derecha (Valor de
Instance) muestra el valor de instancia luego de que se ejecuta cada lnea de cdigo.

Thread 1 Thread 2 Valor de Instance
public static
ChocolateBoiler
getInstance() {

null
public static
ChocolateBoiler
getInstance() {
null
if (uniqueInstance == null)
{


null
if (uniqueInstance == null)
{

null


uniqueInstance = new
ChocolateBoiler();

<object1>
return uniqueInstance; <object1>

uniqueInstance = new
ChocolateBoiler();
<object2>
return uniqueInstance; <object2>
Tratar con multithreading (multihilo)

Nuestros problemas de multithreading estn casi trivialmente fijados por hacer getInstance () un
mtodo sincronizado

public class Singleton {
private static Singleton uniqueInstance;
// other useful instance variables here
private Singleton() {}
public static synchronized Singleton getInstance() {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
// other useful methods here
}

NOTA:

Mediante la adicin de la palabra clave " synchronized " para getInstance (), forzamos a
todos los hilos que esperar su turno antes de que pueda entrar en el mtodo. Es decir, no
hay dos hilos pueden entrar en el mtodo en el mismo tiempo.
Esto soluciona el problema. Pero , la sincronizacin gasta mucho recursos puesto que la
nica sincronizacin de tiempo que es relevante es la primera vez que a travs de este

8
mtodo. Es decir, una vez que hemos establecido la variable uniqueInstance a una
instancia de Singleton, no tenemos ms necesidad de sincronizar este mtodo. Despus de
la primera vez, la sincronizacin es sobrecarga innecesaria.

Usar "bloqueo doble comprobacin"

Para reducir el uso de sincronizacin en getInstance () con el bloqueo de doble comprobacin,
primero comprobamos si se crea una instancia, y si no, entonces nos sincronizamos. De esta
manera, slo se sincroniza por primera vez a travs, justamente lo que queremos.

public class Singleton {
private volatile static Singleton uniqueInstance;
private Singleton() {}
public static Singleton getInstance() {
if (uniqueInstance == null) {
synchronized (Singleton.class) {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}


Resumen
El cdigo que soporta Singleton garantiza que una clase tiene slo una instancia y proporciona un
punto de acceso global a ella. En un entorno multiproceso, se debe tener cuidado para gestionar la
colaboracin de los temas que pueden acceder a los mtodos y los datos de un producto nico en
aproximadamente el mismo tiempo.
El hecho de que un objeto es nico no significa necesariamente que el patrn Singleton est en
uso. El patrn Singleton centraliza la autoridad en una sola instancia de una clase al ocultar el
constructor y proporciona un nico punto de acceso a la creacin de objetos.





9
Propiedad Caracterstica
Nombre Singleton
Clasificacin Creacional
Intencin Garantizar que una clase slo tenga una instancia y proporcionar un
punto de acceso global a ella
Motivacin Registro discrecional de las llamadas a mtodos. Adicionalmente,
registrar mensajes de depuracin
Aplicabilidad:


Usaremos esta instancia cuando debe haber exactamente una
instancia de una clase y deba ser accesible a los clientes desde un
punto de acceso conocido.
La nica instancia debera ser extensible mediante herencia y los
clientes deberan ser capaces de utilizar una instancia extendida sin
modificar su cdigo.
Estructura

Participantes

Singleton:
define una operacin de clase getInstance que permite a los
clientes acceder a su instancia nica
Puede ser responsable de crear su nica instancia.
Colaboraciones

Los clientes acceden a la nica instancia solamente a travs de la
operacin getInstance


Singleton s=Singleton.getInstance()
s.op1();

Se suelen emplear estereotipos para simplificar los diagramas de
secuencia y colaboracin
Implementacin:

Ocultar el constructor
Definir getInstance como esttico
Pueden ser necesarias operaciones de terminacin (depende de la
gestin de memoria del lenguaje)
En ambientes concurrentes es necesario usar mecanismos que
garanticen la atomicidad del mtodo getInstance
Si se desea garantizar la unicidad a nivel de sistema, se puede
hacer uso de semforos
Consecuencias Reduce el espacio de nombres
Rompe el esquema habitual de creacin de objetos




10
Bibliografa
Code monkey. (s.f.). Obtenido de http://codemonkeyjunior.blogspot.com/2013/01/ejemplo-de-
patron-de-diseno-singleton.html
Freeman, E., & Freeman, E. (2004). Head First Design Pattern. O'Reilly.
Metsker, S. J. (2002). Design Patterns Java Workbook. Pearson Education.
Metsker, S. J. (s.f.). DESIGN PATTERNS IN JAVA. Pearson Education,.
Taringa. (s.f.). Patron de diseo. Obtenido de
http://www.taringa.net/posts/imagenes/14676010/Patrones-de-Diseno-Singleton.html

También podría gustarte