En Ingeniería De Software, Singleton o Instancia Única es un patrón de diseño que permite 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.
1. Maestria en Sistemas Computacionales
Diseño Orientado a Objetos
Patron Semifallo oPatron Semifallo o
de Instancia Unicade Instancia Unica
(Pattern Singleton)(Pattern Singleton)
Expone:
Ing. Fernando Alfonso Casas De la Torre
Catedratico:
Dr. Diego Uribe Agundis
2. Patron SingletonPatron Singleton
DEFINICION:
En Ingeniería De Software, Singleton o Instancia Única es un patrón de
diseño que permite 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).
3. DEFINICION:
La idea del Patrón Singleton es proveer un mecanismo para limitar el número
de instancias de una clase.
Por lo tanto el mismo objeto es siempre compartido por distintas partes del
código. Puede ser visto como una solución más elegante para una variable
global porque los datos son abstraídos por detrás de la interfaz que publica la
Clase Singleton.
Dicho de otra manera, esta patrón busca garantizar que una clase sólo tenga
una instancia y proporcionar un punto de acceso global a ella.
Patron SingletonPatron Singleton
4. USOS:
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.
Patron SingletonPatron Singleton
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.
5. USOS:
Este tipo de patron es identificable y aplicable cuando:
♦ Deba haber exactamente una instancia de una clase y deba ser accesible a
los clientes desde un punto de acceso conocido.
♦ Se requiera de un acceso estandarizado y conocido públicamente.
Sus usos más comunes son clases que representan objetos unívocos. Por
ejemplo, si hay un servidor que necesita ser representado mediante un objeto,
este debería ser único, es decir, debería existir una sola instancia y el resto de
las clases deberían de comunicarse con el mismo servidor. Un Calendario, por
ejemplo, también es único para todos.
Patron SingletonPatron Singleton
No debe utilizarse cuando una clase esta
representando a un objeto que no es único, por
ejemplo, la clase Persona no debería ser Singleton,
ya que representa a una persona real y cada persona
tiene su propio nombre, edad, domicilio, DNI, etc.
6. EJEMPLO
A continuacion se presenta una analogia del mundo real de como seria un
Patron Singleton utilizando el cargo de Presidente de los EU que se podria
identificar como un Singleton.
La Constitucion de EU especifica los
metodos por los cuales se elije un
presidente: limita los poderes que
tiene, la duracion de su mandato y
define el modo de la sucesion. Como
resultado solo se tiene un presidente
a un tiempo y el que ocupa el cargo
es llamado Presidente de los EU.
Patron SingletonPatron Singleton
7. Diagrama UML
Para garantizar que habra al menos una instancia de una clase podemos
aplicar el patron Singleton y como se muestra mediante el diagrama UML en el
que se aprecia que…
• UniqueInstance es una clase variable que
mantiene a una misma y unica instancia.
• getInstance() es un metodo de una clase que
puede autoreferenciarse.
• El constructor es privado.
Patron SingletonPatron Singleton
8. Diagrama UML
En el diagrama UML, la clase que es Singleton define una instancia para que
los clientes puedan accederla. Esta instancia es accedida mediante un método
de clase.
Los clientes (quienes quieren acceder a la
clase Singleton) acceden a la única instancia
mediante un método llamado getInstance().
Por lo tanto este patron es muy util para
clases que representan objetos unicos.
Patron SingletonPatron Singleton
9. Una implementación correcta en el lenguaje de programación Java es la
siguiente:
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
// El constructor privado no permite que se genere un constructor por defecto.
// (con mismo modificador de acceso que la definición de la clase)
private Singleton()
{} public static Singleton getInstance() {
return INSTANCE;
}
}
Patron SingletonPatron Singleton
Se coloca una variable al mismo tiempo que la clase
llamada por convencion «INSTANCE» y aquí reside el
secreto del patron ya que dicha variable es la que
instancia por unica vez y la devuelve al cliente.
10. El ejemplo de libro «Head Fhrist» dedicado a patrones muestra una clase
llamada ChocolateBoiler (*) que ejemplifica el control de un horno de chocolate
que muestra que puede tener al menos una instancia
(*) tomado del libro del curso “Head First Design Patterns de Eric Freeman
Patron SingletonPatron Singleton
11. En el ejemplo del ChocolateBoiler al hacer referencia al objeto tipo Singleton, el
cliente-objeto puede crear al instancia al invocar la clase.
Patron SingletonPatron Singleton
Si no existe la crea y si existe la usa, pero esto puede
dar problemas en un ambiente multitareas o multihilos.
12. Otro posible escenario para ChocolateBoiler en el que ahora no se crea la
instancia sino que se solicita informar su condicion …
Patron SingletonPatron Singleton
13. Problemas en ambientes multihilo
Si estamos en un ambiente de un solo hilo (single-thread) esta implementación es
suficiente. En contrapartida, tiene serios problemas en entornos multihilo (multi-thread)
dado que, debido a cuestiones de sincronización y concurrencia, puede crearse más de
una instancia del miembro instance.
Patron SingletonPatron Singleton
¿Cómo puede ser esto posible?
Imaginemos que dos hilos evalúan la condición
instance == null y en ambos casos es
verdadera.
En este caso, ambos hilos crearán la instancia,
violando el propósito del patrón Singleton.
Los problemas que se producen a raíz de esto pueden ser muy
difíciles de detectar. La creación dual suele producirse en forma
intermitente e incluso puede no suceder (no es determinista).
14. Problemas en ambientes multihilo
Si el Singleton es absolutamente stateless (es decir, no mantiene ningún tipo de estado)
puede no ser un problema.
Si estamos en C++ o algun lenguaje, se puede producir un memory leak, dado que sólo
se va a eliminar uno de los objetos aunque hayamos creado dos.
Si el Singleton es statefull (mantiene estado) se pueden producir errores sutiles. Por
ejemplo, si se modifica el estado del objeto en el constructor, pueden producirse
inconsistencias, dado ese código de inicialización se ejecuta mas de una vez.
Patron SingletonPatron Singleton
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. Quizás en la segunda
inicialización, una instancia ya había incrementado su
contador, pero debido a la ejecución de ese código de
inicialización, ese incremento se perderá.
15. El problema con el patron es que en caso de procesamiento multihilos se
pueden crear multiples instancias en cada uno de los hilos y estas pueden
generar descontrol en el sistema. En este caso, dos hilos solicitan la instancia
a través de la función GetInstance, pero ésta todavía no ha sido creada. Por lo
tanto, en los dos casos se procede a la creación de la única instancia.
Patron SingletonPatron Singleton
Las dos columnas a la izquierda
(Thread 1 y Thread 2) representan los
hilos de ejecución y muestran el código
que se ejecuta. La columna de la
derecha (Valor Instance) muestra el
valor de instance luego de que se
ejecuta cada línea de código.
16. ¡Gracias por su atencion!
Expuso:
Ing. Fernando Alfonso Casas De la Torre
Catedratico:
Dr. Diego Uribe Agundis
REFERENCIAS:
BLOG: Mi granito de JAVA
http://migranitodejava.blogspot.mx/2011/05/singleton.html
BLOG: CODEJAVU
http://codejavu.blogspot.mx/2013/07/ejemplo-patron-singleton.html
Sitio WIKIPEDIA
https://es.wikipedia.org/wiki/Singleton
Sitio MICROSOFT
https://msdn.microsoft.com/es-es/library/bb972272.aspx#EDAA