enero 08, 2007

Utilizar el Patron Singleton con formularios MDI

Objetivo: Que desde una aplicación Windows sólo podamos tener una forma hija abierta.

-------1. En la forma hija

'Variable global
Private Shared frmInstance As frmReport = Nothing

'Finalmente crearemos una función shared que será la que finalmente controlara la creación o manejo de la instancia del formulario, logrando obtener solo un formulario 'abierto para este form1.


'Función que verifica sola a una instancia del form1
Public Shared Function Instance() As form1
If frmInstance Is Nothing OrElse frmInstance.IsDisposed = True Then
frmInstance = New form1
End If
frmInstance.BringToFront()
Return frmInstance
End Function

'2-En la forma padre.
'Ahora en el padre escribiremos el llamado al hijo para crear la instancia, o si ya esta 'creada, entonces pondrá el formulario hijo en frente para que lo podamos ver.

Dim frmHijo as form1 = form1.Instance
frmHijo.MdiParent = Me
frmHijo.Show

Referencia:
href="http://www.mentores.net/articulos/Percynet_EditorTexto.htm"

El Patrón Singleton

Objetivo: Hacer que la instancia de un objeto sea accesible globalmente, y que sea única. Para ello es necesario crear un método en la clase que se desee sólo tener una instancia a la ves.

Yo por ejemplo hice un objeto mapper el cuál necesitaba que no fuera instanciado más de una vez por la aplicacion que lo usara.

'---1 La clase Singleton-----------------------------------------------------
Public Class MapperEmpleado
Private pnombre As String

Public Property nombre() As String
Get
Return pnombre
End Get
Set(ByVal Value As String)
pnombre = Value
End Set
End Property

Private Shared mInstance As MapperEmpleado
Private Shared mMutex As New System.Threading.Mutex()

' Constructor privado para no poder instanciar la clase
Private Sub New()
End Sub

'Método que verifica la existencia del objeto al querer instanciar.
Public Shared Function GetInstance() As MapperEmpleado
mMutex.WaitOne()
If mInstance Is Nothing Then
mInstance = New MapperEmpleado()
End If
mMutex.ReleaseMutex()
Return mInstance
End Function

End Class

--2 La aplicación desde que se consume a la clase que implementa el patrón singleton.

'Para poder instanciar el objeto se usa el método GetInstance ya que el constructor New() es privado.
Dim obj As MapperEmpleado = MapperEmpleado.GetInstance
obj.nombre = "Julio"
Dim obj2 As MapperEmpleado = MapperEmpleado.GetInstance
MessageBox.Show(obj2.nombre)
--El nombre es el mismo porque sólo se permite una clase.


Aquí un link de referencia sobre este patrón:
http://www.mug.org.ar/Patrones/ArticPatrones/304.aspx

http://searchvb.techtarget.com/tip/0,289483,sid8_gci921128,00.html