Acoplamiento: junto con la modularidad, la cohesin y otros factores, permiten mejorar la programacin y el diseo de sistemas informticos y aplicaciones, y son muy importantes en el incremento de la reutilizacin de los cdigos.ios
Antipatrn: de diseo es un patrn de diseo que invariablemente conduce a una mala solucin para un problema.
Singleton: es un patrn que garantiza que una clase slo tenga una instancia y proporciona un punto de acceso global a sta instancia.
Introduccin
Cuando se habla de un patrn de diseo se refiere a una solucin de un problema concreto en el desarrollo de software. Pero no cualquier solucin, slo aquellas que se ha demostrado que son eficientes en diferentes escenarios y reutilizables en gran cantidad de contextos de aplicaciones.
Los patrones de diseos no fueron inventados fueron descubierto.
En este caso se trtara el patrn de diseo Singleton el cual garantiza que una clase slo tenga una instancia y proporciona un punto de acceso global a sta instancia.
Contenido
Patrn de diseo: Singleton El patrn Singleton garantiza que una clase slo tenga una instancia y proporciona un punto de acceso global a sta instancia. 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. ( http://msdn.microsoft.com, s.f.)
Estructura
Ejemplo: Teniendo en cuenta estas caractersticas vamos a desarrollar una clase singleton:
En esta pequea porcin de cdigo hemos conseguido realizar una nica instancia en el momento en el que se llama por primera vez. Adems hemos creado un constructor con acceso privado para que nadie pueda instanciar la clase. Y para terminar hemos creado una propiedad de solo lectura con la que se puede acceder a la instancia creada. Pero sta no ser Thread-safe. Para conseguirlo podramos modificar la clase de la siguiente forma:
Al crear el atributo que almacena la instancia como readonly, y al ser esttica, se instanciar al arrancar la aplicacin. As conseguiremos que sea una clase thread-safe. Es decir, que no habr problemas si varios procesos acceden a esta clase al mismo tiempo. No obstante, si quisiramos respetar que solo se instanciara el objeto bajo demanda, deberamos usar bloqueos:
Gracias al bloqueo ya podremos ejecutar nuestra clase singleton en un contexto multihilo, instancindola slo cuando se ha solicitado la primera vez. A este efecto de carga en diferido se le denomina en ingls Lazy Loading. Y desde la versin 4.0 de la framework .net se nos provee un objeto que nos ayuda a realizarla: Lazy. Por lo que podramos simplificar nuestro ejemplo usndolo:
El objeto Lazy ya es de por si thread-safe y en su declaracin simplemente debemos indicarle de qu forma se debe instanciar el objeto que contiene. Por esta razn es posiblemente la mejor implementacin del patrn singleton. Si por ejemplo estuvieramos desarrollando la herramientas de log de nuestra aplicacin, bastara con que aadieramos las funciones necesarias para escribir en el log a nuestra clase singleton:
Viendo este cdigo en nuestra aplicacin, est claro que para poder escribir en el log desde cualquier punto de la misma slo tendremos que hacer esta llamada:
Al pararnos a pensar las consecuencias de escribir este cdigo, caeremos en la cuenta de que singleton nos est creando una dependencia en todo el programa donde queramos tener informacin del proceso en forma de logs (eso es a lo largo de toda la aplicacin). Algo que comunmente conocemos como acoplamiento entre clases.
El acoplamiento puede dar varios problemas a lo largo del ciclo de vida de un software. Como por ejemplo a la hora de realizar pruebas unitarias. Pero no es objeto de este artculo centrarse en este problema. Aunque si lo es proponer soluciones de implementacin del patrn singleton que se adapten a un desarrollo slido.
Si quisieramos evitar este acoplamiento, es recomendable usar un IoC Container (Inversion Of Control Container) para respetar la D de los pincipios SOLID: Dependency Inversion Principle. Esta, por as llamarla, norma nos dice que debemos depender de las abstraciones (las interfaces, los contratos) no de las concreciones (clases que implementan esas interfaces).
En las frameworks de inversin de control ms conocidas se han implementado mecanismos que nos permiten crear objetos singleton desde el propio contenedor. Esto quiere decir que simplemente tendramos que crear una interfaz y una implementacin de la misma, sin preocuparnos de como se instancia. Visto en forma de cdigo sera esto:
De esta forma, delegaramos la gestin del ciclo de vida de las instancias al IoC Container que hayamos decidido. A continuacin mostraremos cmo podemos configurar una instancia singleton usando las frameworks de inyeccin de dependencias (DI) ms conocidas:
Pero esto no quiere decir que no nos sirva la implementacin de singleton que hicimos anteriormente, ya que es posible que no nos fiemos o que nuestro contenedor no tenga ningn artefacto que nos facilite la implementacin singleton. Para estos casos, podramos hacer que un contenedor como Unity nos devolviera la instancia singleton que gestiona nuestra clase usando la propiedad esttica. Simplemente tendramos que seguir usando una interface, implementarla en nuestra clase singleton y registrar una instancia en lugar de una clase en el contenedor:
De esta forma, por ejemplo, si usamos el contenedor de Unity, tendramos que registrar su valor as:
Con este cdigo sera nuestro singleton Logger quien gestione el ciclo de vida y conseguiramos desacoplarnos de la implementacin gracias al IoC.
Podramos hacer lo mismo con Structure maps:
Y para finalizar, con Ninject:
A lo largo de este artculo hemos visto diferentes formas de implementar el patrn singleton. Un patrn de desarrollo sigue siendo vigente y vlido. Lo nico que tenemos que tener en cuenta, es evitar aplicarlo donde no corresponde o de una forma incorrecta. Algo que conocemos como el antipatrn singletonitis. (programandonet, s.f.)
Conclusin.
Singleton es uno de los patrones ms fciles de entender y manipular lo nico que tenemos que tener en cuenta, es evitar aplicarlo donde no corresponde o de una forma incorrecta. Algo que conocemos como el antipatrn singletonitis Recomendaciones
Estimado lector al culminar con este trabajo puedo recomendar que: Cuando se utilizan patrones de diseo para la resolucin de problemas o para la creacin de un software los resultados que se obtienen son extremadamente favorables ya que son soluciones que han sido probadas por en muchas situaciones similares. Es necesario tener el conocimiento sobre los diversos patrones de diseo que existen para seleccionar el ms adecuado a la hora de dar soluciones a problemas.
Bibliografa http://msdn.microsoft.com. (s.f.). Obtenido de http://msdn.microsoft.com: http://msdn.microsoft.com/es-es/library/bb972272.aspx#m21 programandonet. (s.f.). http://programandonet.com. Obtenido de http://programandonet.com: http://programandonet.com/web/patrones-diseno-singleton/