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
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).
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
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.
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.
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
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
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
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.
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
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.
Otro posible escenario para ChocolateBoiler en el que ahora no se crea la
instancia sino que se solicita informar su condicion …
Patron SingletonPatron Singleton
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).
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á.
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.
¡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

Patron Singleton

  • 1.
    Maestria en SistemasComputacionales 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: EnIngenierí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 delPatró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 delpatró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 depatron 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 sepresenta 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 garantizarque 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 eldiagrama 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 correctaen 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 delibro «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 ejemplodel 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 escenariopara ChocolateBoiler en el que ahora no se crea la instancia sino que se solicita informar su condicion … Patron SingletonPatron Singleton
  • 13.
    Problemas en ambientesmultihilo 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 ambientesmultihilo 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 conel 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 suatencion! 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