martes, 22 de mayo de 2012

Para que sirve el patron Singleton?


Para que sirve el patron Singleton?


Antes de contestar la pregunta “¿Para que sirve el patrón Singleton?”; contestemos esta: ¿Qué es el patrónSingleton? , según Wikipedia:
El patrón de diseño Singleton (instancia única) está diseñado para 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. (http://es.wikipedia.org/wiki/Singleton) En el articulo escrito por  León  Weliki para MSDN, profundiza sobre el tema en cuestión (http://msdn.microsoft.com/es-es/library/bb972272.aspx).
Resumiendo las definiciones, el patrón Singleton me asegura que solo se creará una única instancia de la clase. Contestando a la segunda pregunta, para que me sirve?. Empecemos a definir un contexto donde pueda aplicar este patrón;  normalmente las tablas de clientes y proveedores tienen un campo Distrito, que es el lugar donde se encuentra ubica la empresa. Es muy probable que en cada mantenimiento hagamos uso de la instancia de la clase Distrito con la finalidad de obtener los datos, entonces la conexión a la base de datos se hará varias veces cargando los mismos datos, pero en diferentes formularios, aquí podemos centralizar la carga de los datos por única vez, y que luego pueda ser usada en diferentes partes de la aplicación.
Se crea la clase Distrito que implemente el patrón Singleton:
   1: Imports System.Data.SqlClient
   2:  
   3: Public Class Distrito
   4:     Private Shared Instancia As Distrito = Nothing
   5:     Private dt As New DataTable
   6:  
   7:     'Se inicia el constructor por unica vez
   8:     Private Sub New()
   9:         Dim cnx As New SqlConnection("Server=.\SQL2008;Database=VentasDemo;Integrated Security=SSPI;")
  10:         Dim cmd As New SqlCommand("Select Cod_Dis, Nom_Dis From TB_Distrito Order By Nom_Dis", cnx)
  11:  
  12:         cnx.Open()
  13:         dt.Load(cmd.ExecuteReader)
  14:         cnx.Close()
  15:     End Sub
  16:     Public Shared Function getInstancia() As Distrito
  17:         If Instancia Is Nothing Then
  18:             Instancia = New Distrito()
  19:         End If
  20:         Return Instancia
  21:     End Function
  22:     Public Function GetDistritos() As DataTable
  23:         Return dt
  24:     End Function
  25: End Class
El método getInstancia asegura que la clase tenga una única instancia, por lo tanto el constructor se ejecuta una sola vez, es aquí donde colocare el código que carga los distritos de la base de datos, y los almacenare en un objeto DataTable. Observe  que por una sola vez se conectara a la base de datos para obtener los datos de distritos, para luego usarlo en toda la aplicación. El objeto Instancia me indicara si se creo la instancia de Distrito, caso contrario es nulo. El método GetDistritos devuelve el objeto DataTable, con los datos cargados.
Para probar la clase Distrito, creare tres formularios: FormMDI, que será mi formulario principal, Form1 que será el mantenimiento de Clientes y el Form2 será el mantenimiento de Proveedores. En cada formulario creare el objeto Distrito, pero solo en uno de ellos se crea la instancia.
image
Para el FormMDI, tengo el siguiente diseño:
image

3 comentarios:

  1. Parece interezante el patron de singleton, le pediria si pudiera subir articulos en base seguridad web.

    ResponderEliminar
  2. Saludos, agregate en mi blog como seguidor... no te olvides...

    visita mi blog y comentalo...

    http://davidfloreszafra.blogspot.com/

    ResponderEliminar