patrones dedi se ñ o singleton

12
SECCION DESCRIPCION Nombre del Patrón Tipo de Patrón: Creación de Objetos o Instancia Única Nombre significativo: SINGLETON Propósito ¿Qué hace el patrón? Está diseñado para restringir la creación de objetos pertenecientes a una clase o el valor de un tipo a un único objeto. ¿Cuál es su razón? Se asegura de que una determinada clase sólo tiene una instancia y proporciona un punto de acceso a dicha instancia ¿De qué problema particular de diseño se ocupa? Su intención consiste en garantizar que una clase sólo tenga una instancia y proporcionar un punto de acceso global a ella. Aplicabilidad ¿Cuáles son las situaciones en las que el patrón puede aplicarse? Debe existir una única instancia de una clase, y ésta debe ser accesible a los clientes desde un punto de acceso bien conocido. La única instancia puede ser extendida (subclase), y los clientes deberían poder usar la instancia extendida sin modificar su código. Ejemplos de casos mal planteados en los que el patrón puede aplicarse CREACION DE HISTORIALES CREACION DE COCHES ¿Cómo pueden reconocerse estas situaciones? CREACION DE HISTORIALES Como nos piden que se genere un historial de los eventos ejecutados por los usuarios utilizaremos el patrón Singleton, ya que este historial es general para todos los usuarios del sistema, así crearemos un punto global para la

Upload: paul-vega

Post on 25-Sep-2015

215 views

Category:

Documents


2 download

DESCRIPTION

Doseño

TRANSCRIPT

SECCIONDESCRIPCION

Nombre del PatrnTipo de Patrn: Creacin de Objetos o Instancia nicaNombre significativo: SINGLETON

PropsitoQu hace el patrn?Est diseado para restringir la creacin de objetos pertenecientes a una clase o el valor de un tipo a un nico objeto.

Cul es su razn?Se asegura de que una determinada clase slo tiene una instancia yproporciona un punto de acceso a dicha instancia

De qu problema particular de diseo se ocupa?Su intencin consiste en garantizar que una clase slo tenga una instancia y proporcionar un punto de acceso global a ella.

AplicabilidadCules son las situaciones en las que el patrn puede aplicarse? Debe existir una nica instancia de una clase, y sta debe ser accesible a los clientes desde un punto de acceso bien conocido. La nica instancia puede ser extendida (subclase), y los clientes deberan poder usar la instancia extendida sin modificar su cdigo.Ejemplos de casos mal planteados en los que el patrn puede aplicarse

CREACION DE HISTORIALES CREACION DE COCHESCmo pueden reconocerse estas situaciones?

CREACION DE HISTORIALESComo nos piden que se genere un historial de los eventos ejecutados por los usuarios utilizaremos el patrn Singleton, ya que este historial es general para todos los usuarios del sistema, as crearemos un punto global para la aplicacin que permita ir almacenando cada evento generado independientemente de quien lo ejecute CREACION DE COCHESCada vez que se procesa el bucle for se realiza una llamada al mtodo getInstancia() de la clase Coche, devolvindose siempre una misma instancia (un slo objeto) de dicha clase (que ser creada la primera vez que se llame a dicho mtodo).

EstructuraRepresentacin grfica de las clases en el patrn:Diagramas de clases

Diagrama de clases de Casos de Uso

Diagramas de Secuencias

Diagramas de despliegue

Diagrama Secuencias de datos

Diagrama fsico de datos

Participantes

Las clases y/u objetos que participan en el patrn de diseo y sus responsabilidad:

Instancia nica o Singleton: Define un mtodo de clase que permite a los clientes acceder a la instancia nica y normalmente tambin es la responsable de crear su nica instancia.

Colaboraciones

La forma en que los participantes colaboran para llevar a cabo sus responsabilidad: Los clientes acceden a la instancia del Singleton a travs de la operacin definida a tal fin (instance()).

Consecuencias

Cmo el patrn soporta sus objetivos? Mantener una variable global para facilitar el acceso. De este modo no resolvemos el problema porque siempre podemos instanciar mltiples objetos en variables locales aunque si es cierto que es de fcil acceso. Restringiendo el acceso al constructor de modo que una vez creada una instancia ya no se puedan crear ms. Proporcionando un mecanismo para acceder a la instancia si esta ya ha sido creada y sino que la cree en ese momentoCules son las concesiones y resultados de usar un patrn? Acceso controlado a la instancia nica. Reduce el espacio de nombres al evitar variables globales. Permite el refinamiento de operaciones y representacin mediante el uso de herencia. En este caso en lugar de tener una nica instancia nica de ella misma tiene una instancia nica de una subclase. En este caso se usa la instancia de la subclase con la interfaz de la superclase. Permite un nmero variable de instancias. Ms flexible que las operaciones de clase.

Implementacin

Qu tcnicas deben tenerse en cuenta para implementar el patrn? Asegurar la unicidad de la instancia de la clase. Extender la clase InstanciaUnica o Singleton: El mtodo de clase instacia conoce las subclases de la jerarqua y crea la instancia deseada. Establecer algn mecanismo para registrar las subclases. Declarar el constructor como privado y adems establecer un atributo como privado para almacenar la instancia. Para inicializar el atributo privado emplear un bloque esttico. Establecer un mtodo pblico que proporcione la instancia correspondiente al atributo privado de la clase.Hay temas propios de un lenguaje especfico?

ACTION SCRIPT3 AUTOIT C# C++ D DELPHI JAVA JAVASCRIPT OBJECTIVE C PERL PHP5 PYTHON VISUAL BASIC. NET

Cdigo de ejemplo

Fragmentos de cdigo que ilustren como se debe implementar el patrn en un lenguaje de programacinhttp://es.wikipedia.org/wiki/Singleton ACTION SCRIPT3public class Singleton{ private static var instance:Singleton; private static var allowInstance:Boolean; public function Singleton(){ if(!allowInstance){ throw new Error("Debes usar getInstance()"); }else{ trace("Se inicializ una instancia de Singleton"); } } public static function getInstance():Singleton{ if(instance==null){ allowInstance=true; instance= new Singleton(); allowInstance=false; }else{ trace("Se regresa la instancia existente"); } return instance; }} AUTOIT#include if _Singleton("test",1) = 0 Then Msgbox(0,"Warning","An occurence of test is already running") ExitEndIfMsgbox(0,"OK","the first occurence of test is running") C#public class Singleton{ // Variable esttica para la instancia, se necesita utilizar una funcin lambda ya que el constructor es privado private static readonly Lazy instance = new Lazy(() => new Singleton()); // Constructor privado para evitar la instanciacin directa private Singleton() { } // Propiedad para acceder a la instancia public static Singleton Instance { get { return instance.Value; } }} // Clase de pruebapublic class Prueba{ private static void Main(string[] args) { //Singleton s0 = new Singleton(); //Error Singleton s1 = Singleton.Instance; Singleton s2 = Singleton.Instance; if(s1==s2) { // Misma instancia } }} C++template class Singleton{ public: static T& Instance() { static T laInstanciaSingleton; //asumir T posee un constructor por defecto return laInstanciaSingleton; }}; class Singleton : public Singleton{ friend class Singleton; //para dar acceso al constructor privado de SoloUno //..definir aqu el resto de la interfaz}; Dfinal class Singleton { private static Singleton instance; static this() { instance = new Singleton(); } static Singleton opCall() { return instance; }} auto s1 = Singleton();auto s2 = Singleton(); assert(s1 == s2); DELPHItype TSingleton = class public class function NewInstance: TObject; override; procedure FreeInstance; override; class function RefCount: Integer; end;var Instance : TSingleton = nil; Ref_Count : Integer = 0; JAVApublic class Singleton { private static Singleton INSTANCE = new Singleton(); // El constructor privado no permite que se genere un constructor por defecto. // (con mismo modificador de acceso que la definicin de la clase) private Singleton() {} public static Singleton getInstance() { return INSTANCE; }} JAVASCRIPTSingleton = function Singleton$constructor() { return { getInstance : function Singleton$getInstance() { return this; } };}(); OBJECTIVE C#import "Singleton.h" @implementation Singleton +(Singleton *) getInstance{ static Singleton* singleton = nil; @synchronized(self){ if (!singleton) { singleton = [self new]; } } return singleton;} @end PERL[Singleton.pm]package Singleton; my $singleton;sub new {my $class = shift;$singleton ||= bless {}, $class;}... [foo.pl]require Singleton; my $object1 = new Singleton;my $object2 = new Singleton;# El mismo objeto PHP5

PYTHONclass Singleton (object): instance = None def __new__(cls, *args, **kargs): if cls.instance is None: cls.instance = object.__new__(cls, *args, **kargs) return cls.instance #UsagemySingleton1 = Singleton()mySingleton2 = Singleton() #mySingleton1 y mySingleton2 son la misma instanciaassert mySingleton1 is mySingleton2 VISUAL BASIC. NETPublic Class Singleton Private Sub New() 'CONSTRUCTOR End Sub Private Shared instancia As Singleton = Nothing Public Shared Function getInstancia As Singleton If instancia Is Nothing Then instancia = New Singleton() End If Return instancia End FunctionEnd Class

Usos ConocidosEjemplos del patrn encontrados en sistemas reales:

CREACION DE HISTORIALES CREACION DE COCHES

Patrones relacionadosQu patrones estn relacionados con el patrn que se est describiendo? ABSTRACT FACTORY, BUILDER PROTOTYPECules son las principales diferencias?

ABSTRACT FACTORY, nos permite crear, mediante una interfaz, conjuntos o familias de objetos (denominados productos) que dependen mutuamente y todo esto sin especificar cul es el objeto concreto. BUILDER, es usado para permitir la creacin de una variedad de objetos complejos desde un objeto fuente (Producto), el objeto fuente se compone de una variedad de partes que contribuyen individualmente a la creacin de cada objeto complejo a travs de un conjunto de llamadas a interfaces comunes de la clase Abstract Builder. PROTOTYPE, especifica la clase de objetos a crear mediante la clonacin de un prototipo que es una instancia ya creada. La clase de los objetos que servirn de prototipo deber incluir en su interfaz la manera de solicitar una copia, que ser desarrollada luego por las clases concretas de prototipos.Con que otros patrones deben usarse?

FACADE, dan una solucin probada y documentada a problemas de desarrollo de software que aparecen en un contexto similar. El patrn de diseo Fachada (Facade) es un tipo de patrn estructural.