Você está na página 1de 10

Aplicando patrones de Diseo en VB .

NET
Mapa del Sitio | Home | Worldwide

Buscar en Microsoft.com:

Ir
Home | MSDN Library
Productos y Tecnologas MSDN Suscripciones Arquitectura Centros de Desarrollo Informacin Tcnica MSDN Acadmico Universidad .NET Eventos MSDN Media Center Comunidad Online
El objetivo de este documento es darles una introduccin sobre el desarrollo de aplicaciones orientado a objeto aplicando patrones de diseo y algunos ejemplos con VB.NET. Por Ing. Enriquillo Man Ramrez (MCSD .NET)

| Descarga

| DCE 2005

| Net Pro

| Eventos

| Mapa

| Pases

| Contacto
Bienvenido a MSDN en Espaol

Aplicando Patrones de Diseos en VB .NET

Partnering y Certificacin TechNet Soporte Tcnico

Normal

Calificar

Mi Panorama SOS Escribe para Nosotros

Muchas veces en el da a da de los analistas, arquitectos y desarrolladores de aplicaciones nos toma mucho tiempo determinar cual ser la mejor forma de implementar una solucin a un problema planteado en el anlisis para el desarrollo de una aplicacin, tambin muchas veces se nos presentan problemas que ya en situaciones anteriores se nos haban presentado y habamos resuelto, dndonos la ventaja de poder aplicar esta misma solucin al problema actual, pues bien,, algo as es lo que se quiso alcanzar con los patrones de diseo de aplicaciones, recolectar los problemas mas comunes que se presentan en el desarrollo de aplicaciones orientado a objeto y plantear soluciones a estos ya probadas, es decir, rehusar los conocimientos anteriormente adquiridos. El concepto de patrones surgi a partir de un trabajo publicado por Christopher Alexander en los aos 70s, aunque su trabajo estaba orientado a la ingeniera fsica (Edificios, etc.), la comunidad del software tomo su trabajo como base para orientar esta tcnica al desarrollo de software, en agosto del 2002 particip en un seminario sobre "Desarrollo de Software Basado en Componentes" impartido por el Ingeniero Jons A. Montilva de la universidad de los Andes, en este seminario se planteaba que muchos de los avances del desarrollo de aplicaciones estn basados en mtodos aplicados en la Ingeniera Fsica, deca: "El desarrollo de software basado en componentes es un proceso inspirado en la manera en que se producen y ensamblan componentes en la ingeniera de sistemas fsicos", pues bien, la implementacin de patrones para diseo de software no es la excepcin. Los Patrones de Diseo son soluciones a problemas que se presentan repetidamente en el desarrollo de aplicaciones orientado a objeto. Segn GOF (Gang of four, o "El Grupo de los 4"), los patrones se clasifican en 3, de Creacin, Comportamiento y de Estructura. Los patrones de creacin estn dirigidos al proceso de creacin de un objeto, la forma en que se crean los objetos, los de estructura conciernen a la composicin de la clase o los objetos, como stos estarn compuestos, y los de comportamiento tiene que ver con la forma en que los objetos o clases interactan y se les asignan responsabilidades. Las Definiciones tcnicas son las siguientes: Los patrones de creacin separan la forma en que se crean los objetos, de forma que permita tratar las clases a crear de forma genrica apartando la decisin de que clase crear o como crearlas, ocultando los mtodos y clases concretas de tal forma que al variar su implementacin no se vea afectado el resto de la aplicacin. Los patrones de comportamientos estn relacionados con los algoritmos y con la asignacin de responsabilidades a los objetos, es decir, que designan la forma de colaboracin y comunicacin entre objetos. Los patrones de Estructura tienen que ver con la forma en que las clases son agrupadas para formar grandes estructuras, un ejemplo clsico sera una estructura inicial llamada animales, luego otras estructuras que deriva de la anterior llamadas Animales Herbvoros y Animales Carnvoros, estas dos ultimas pertenecen a la clase inicial animales heredando as sus caractersticas y tambin poseen caractersticas particulares. En las versiones anteriores a VB.NET, los desarrolladores que utilizbamos este lenguaje nos encontrbamos en desventajas frente a los programadores de C++, Delphi, Java y otros lenguajes que eran lenguajes que soportaban las caractersticas de la programacin orientada a objeto, (recuerdo que me decan "utiliza un lenguaje de verdad", haciendo referencia a estos lenguajes), pero esto no era limitante para los desarrolladores de VB ya que existen muy buenas aplicaciones y utilitarios

http://www.microsoft.com/spanish/msdn/comunidad/mtj.net/voices/art151.asp (1 of 10)13/04/2007 02:33:51 PM

Aplicando patrones de Diseo en VB .NET


desarrollados en VB. Ahora con la versin .NET de VB los desarrolladores que utilizamos este lenguaje nos colocamos si no a la par con los desarrolladores de lenguajes orientados a objetos, estamos muy cerca, ya que contamos con la tan ansiada y deseada herencia en VB.NET as como otras caractersticas del desarrollo orientado a objeto. Ahora voy a mostrar algunos ejemplos de patrones de creacin aplicados con VB.NET. Patrones de Creacin. GOF clasific los patrones de comportamiento en Factora Abstracta, Factora, Constructor, Prototipo e instancia nica (Abstract Factory, Factory, Builder, Prototype, Singleton) Factora Abstracta (Abstract Factory) Permite crear clases de grupos de familia sin especificar la clase en concreto, por ejemplo. En el siguiente ejemplo se puedo notar que al crear una instancia de la case MundoAnimal se crean tambien 2 instancias, una de AnimalesCarnivoros y otra de Animales Herbivoros.

'Esta interfaz provee los mtodos que sern comunes 'entre nuestras clases concretas, esta es solo una 'representacin abstracta de nuestras clases Public Interface Continente Function CrearCarnivoro() As Carnivoro Function CrearHerbivoro() As Herbivoro End Interface 'Esta es una de nuestras clases concretas que implementaran las funcionalidades que las identifican Public Class Africa Implements Continente Public Function CrearCarnivoro() As Carnivoro Implements Continente.CrearCarnivoro Return New Lobo End Function Public Function CrearHerbivoro() As Herbivoro Implements Continente.CrearHerbivoro Return New Vaca End Function End Class 'Esta es una de nuestras clases concretas que implementaran ' las funcionalidades que las identifican Public Class America Implements Continente Public Function CrearCarnivoro() As Carnivoro Implements Continente.CrearCarnivoro Return New Leon End Function Public Function CrearHerbivoro() As Herbivoro Implements Continente.CrearHerbivoro Return New Bisonte End Function End Class 'Estas son representaciones abstractas de ' los resultados de las operaciones de ' nuestras clases concretas Public Interface Carnivoro Function Comer(ByVal Animal As Herbivoro) As String End Interface Public Interface Herbivoro End Interface 'Estas son los resultados de nuestras clases ' concretas
http://www.microsoft.com/spanish/msdn/comunidad/mtj.net/voices/art151.asp (2 of 10)13/04/2007 02:33:51 PM

Aplicando patrones de Diseo en VB .NET

Public Class Vaca Implements Herbivoro End Class Public Class Leon Implements Carnivoro Public Function Comer1(ByVal Animal As Herbivoro) As String Implements Carnivoro.Comer Return "Leon se lo comi" End Function End Class Public Class Bisonte Implements Herbivoro End Class Public Class Lobo Implements Carnivoro Public Function Comer(ByVal Animal As Herbivoro) As String Implements Carnivoro.Comer Return "Lobo se lo comi" End Function End Class ' Aqu es donde se crea la ilusin mgica ' En esta clase sin importar el Continente que se envi ' Se crean dos 2 animales Herbvoros y Carnvoros ' no hay que preocuparse por si en frica hay lobos o s en ' Amrica hay bisontes dependiendo del continente se crearan ' los animales correspondientes. Public Class MundoAnimal Private AnimalHerbivoro As Herbivoro Private AnimalCarnivoro As Carnivoro Public Sub New(ByVal objContinente As Continente) AnimalCarnivoro = objContinente. CrearCarnivoro AnimalHerbivoro = objContinente. CrearHerbivoro End Sub Public Function EjecutarCadenaAlimenticia() As String Return AnimalCarnivoro.Comer (AnimalHerbivoro) End Function End Class
Ahora para probar nuestra clase crearemos una pequea forma que la invoque y nos presente los resultados, algo como:

Y este es el cdigo para el botn frica:

Try
http://www.microsoft.com/spanish/msdn/comunidad/mtj.net/voices/art151.asp (3 of 10)13/04/2007 02:33:51 PM

Aplicando patrones de Diseo en VB .NET

Dim m_objAfrica As New AbstractFactoryConcrete.Africa Dim objMundo As New AbstractFactoryConcrete.MundoAnimal(m_objAfrica) Label1.Text = objMundo. EjecutarCadenaAlimenticia Catch ex As Exception MessageBox.Show(ex.Message) Finally m_objAfrica = Nothing End Try
Para el botn Amrica solo se debe cambiar la definicin del objeto m_objAfrica a AbstractFactoryConcrete.America y listo, Ej.

Try Dim m_objAmerica As New AbstractFactoryConcrete.America Dim objMundo As New AbstractFactoryConcrete.MundoAnimal(m_objAmerica) Label1.Text = objMundo. EjecutarCadenaAlimenticia Catch ex As Exception MessageBox.Show(ex.Message) Finally m_objAfrica = Nothing End Try
Al hacer clic en su respectivo botn, se desplegar el mensaje correspondiente al continente y su respectivo animal. (Creador) Builder: Separa la construccin de un complejo objeto de sus representaciones para que el mismo proceso de construccin pueda crear diferentes representaciones.

Imports System Imports System.Collections Public Class Vehiculo Private Tipo As String Private Partes As Hashtable = New Hashtable Public Sub New(ByVal pTipo As String) Me.Tipo = pTipo End Sub Default Public Property Parte(ByVal Llave As String) As Object Get Return Partes(Llave) End Get Set(ByVal Value As Object) Partes(Llave) = Value End Set End Property Public Function Mostrar() As String Dim strResultado As New System.Text. StringBuilder strResultado.Append ("---------------------------" + vbCrLf) strResultado.Append("Tipo Vehiculo: " + Tipo + vbCrLf) strResultado.Append(" Marco : " + Partes ("Marco") + vbCrLf) strResultado.Append(" Motor : " + Partes ("Motor") + vbCrLf) strResultado.Append(" #Gomas: " + Partes

http://www.microsoft.com/spanish/msdn/comunidad/mtj.net/voices/art151.asp (4 of 10)13/04/2007 02:33:51 PM

Aplicando patrones de Diseo en VB .NET

("Gomas") + vbCrLf) strResultado.Append(" #Puertas: " + Partes ("Puertas") + vbCrLf) Return strResultado.ToString End Function End Class Public MustInherit Class ConstructorVehiculo Protected m_esteVehiculo As Vehiculo ReadOnly Property Vehiculo() As Vehiculo Get Return m_esteVehiculo End Get End Property MustOverride Sub CrearMarco() MustOverride Sub CrearMotor() MustOverride Sub CrearRuedas() MustOverride Sub CrearPuertas() End Class Public Class Tienda Public Sub Construir(ByVal VehiculoConstr As ConstructorVehiculo) VehiculoConstr.CrearMarco() VehiculoConstr.CrearMotor() VehiculoConstr.CrearPuertas() VehiculoConstr.CrearRuedas() End Sub End Class Public Class Motocicleta Inherits ConstructorVehiculo Public Overrides Sub CrearMarco() Me.m_esteVehiculo = New Vehiculo ("Motocicleta") Me.m_esteVehiculo("Marco") = "Marco Motocicleta" End Sub Public Overrides Sub CrearMotor() Me.m_esteVehiculo("Motor") = "500 cc" End Sub Public Overrides Sub CrearPuertas() Me.m_esteVehiculo("Puertas") = "0" End Sub Public Overrides Sub CrearRuedas() Me.m_esteVehiculo("Gomas") = "2" End Sub End Class Public Class Automovil Inherits ConstructorVehiculo Public Overrides Sub CrearMarco() Me.m_esteVehiculo = New Vehiculo ("Automovil") Me.m_esteVehiculo("Marco") = "Marco Automovil" End Sub Public Overrides Sub CrearMotor() Me.m_esteVehiculo("Motor") = "2500 cc" End Sub Public Overrides Sub CrearPuertas() Me.m_esteVehiculo("Puertas") = "4"
http://www.microsoft.com/spanish/msdn/comunidad/mtj.net/voices/art151.asp (5 of 10)13/04/2007 02:33:51 PM

Aplicando patrones de Diseo en VB .NET

End Sub Public Overrides Sub CrearRuedas() Me.m_esteVehiculo("Gomas") = "4" End Sub End Class
Nuestra pantalla de prueba

Cdigo para invocar las clases Factora (Factory): Se define una interfaz para crear objetos como en Factora Abstracta (Abstract Factory), pero se delega la creacin de las instancias a las subclases. En el siguiente ejemplo las subclases son Reporte y Resumen y estas al ser instanciadas crean tambin las instancias de las pginas correspondientes.

Imports System Imports System.Collections Public MustInherit Class Pagina End Class Public Class PaginaHabilidades Inherits Pagina End Class Public Class PaginaEducacion Inherits Pagina End Class Public Class PaginaExperiencia Inherits Pagina End Class Public Class PaginaIntroduccion Inherits Pagina End Class Public Class PaginaResultados Inherits Pagina End Class Public Class PaginaConclusion Inherits Pagina End Class

http://www.microsoft.com/spanish/msdn/comunidad/mtj.net/voices/art151.asp (6 of 10)13/04/2007 02:33:51 PM

Aplicando patrones de Diseo en VB .NET

Public Class PaginaIndice Inherits Pagina End Class Public Class PaginaBiografia Inherits Pagina End Class Public MustInherit Class Documento Protected m_Paginas As ArrayList = New ArrayList Public Sub New() Me.CrearPaginas() End Sub Public ReadOnly Property Paginas() As ArrayList Get Return m_Paginas End Get End Property MustOverride Sub CrearPaginas() End Class Public Class Resumen Inherits Documento Public Overrides Sub CrearPaginas() Paginas.Add(New PaginaHabilidades) Paginas.Add(New PaginaEducacion) Paginas.Add(New PaginaExperiencia) End Sub End Class Public Class Reporte Inherits Documento Public Overrides Sub CrearPaginas() Paginas.Add(New PaginaIntroduccion) Paginas.Add(New PaginaResultados) Paginas.Add(New PaginaConclusion) Paginas.Add(New PaginaIndice) Paginas.Add(New PaginaBiografia) End Sub End Class
Nuestra pantalla de prueba

Cdigo para invocar

http://www.microsoft.com/spanish/msdn/comunidad/mtj.net/voices/art151.asp (7 of 10)13/04/2007 02:33:51 PM

Aplicando patrones de Diseo en VB .NET

Dim MyDocumento(1) As PatternFactory. Documento Dim MyStringB As New System.Text. StringBuilder MyDocumento(0) = New PatternFactory. Reporte MyDocumento(1) = New PatternFactory. Resumen For Each objDocumento As PatternFactory. Documento In MyDocumento MyStringB.Append("Documento = " + objDocumento.GetType.Name + "-------" + vbCrLf) For Each objPagina As PatternFactory. Pagina In objDocumento.Paginas MyStringB.Append("Pgina = " + objPagina.GetType.Name + vbCrLf) Next MyStringB.Append(" " + vbCrLf) Next TextBox1.Text = MyStringB.ToString
Prototipo (Prototype): Especifica el tipo de objeto a crear usando una instancia prototipo, y crea un nuevo objeto copiado del prototipo. Un ejemplo de la implementacin de este patrn lo podemos ver en los mtodos Copy y Clone de los DataTable en VB.NET, que a partir de una instancia del DataTable podemos crear otra nueva con las mismas caractersticas. Ej.: DataSet.Tables.Add(new DataTable( Tabla1 ) DataSet.Tables.Add(new DataTable( Tabla2 ) DataSet.Tables.Add(new DataTable( Tabla3 ) DataSet.Tables.Add(new DataTable( Tabla4 ) Dim MyTabla1 as DataTable MyTabla = DataSet.Tables( Tabla1 ).Clone Dim MyTabla2 As DataTable MyTabla2 = DataSet.Tables( Tabla2 ).Copy Singleton: Asegura que solo se cree una instancia de la clase y provee un punto global de acceso a esta. En el siguiente ejemplo crearemos una clase que inicialice y retorne un objeto conexin si no existe y si ya existen que nos retorne la instancia existente.

'Implementacin del patrn Singleton Public Class Conexion 'Objeto que contendr la instancia compartida Private Shared m_objConexion As Conexion Private m_FechaCreacion As String 'El Mutex es una clase que proporciona .NET FrameWork 'Con ella evitaremos que en un ambiente multi thread 'se cree algn tipo de conflicto Private Shared m_Mutex As New System. Threading.Mutex Private Sub New() m_FechaCreacion = DateTime.Now.ToString End Sub 'Este mtodo eliminar la instancia ya existente Public Shared Sub KillInstance() m_objConexion = Nothing End Sub 'Este ser el mtodo que proporcionara el acceso 'A la instancia existente, si no existe, creara

http://www.microsoft.com/spanish/msdn/comunidad/mtj.net/voices/art151.asp (8 of 10)13/04/2007 02:33:51 PM

Aplicando patrones de Diseo en VB .NET

'una nueva (mtodo Singleton). Public Shared Function GetInstance() As Conexion m_Mutex.WaitOne() If m_objConexion Is Nothing Then m_objConexion = New Conexion End If m_Mutex.ReleaseMutex() Return m_objConexion End Function 'Propiedad que presenta la fecha y hora en que 'Fue creada la instancia Public ReadOnly Property FechaCreada() As String Get Return m_FechaCreacion End Get End Property End Class
Nuestra pantalla de prueba

La implementacin para probar nuestra clase es bastante sencilla, para el botn instanciar:

Try Dim objConexion As Singleton.Conexion objConexion = Singleton.Conexion. GetInstance TextBox1.Text &= "Instancia Creada el " + objConexion.FechaCreada & vbCrLf Catch ex As Exception MessageBox.Show(ex.Message) End Try
Y para el botn de inicializar:

Try Singleton.Conexion.KillInstance() TextBox1.Text &= "Instancia Eliminada---- " & vbCrLf Catch ex As Exception MessageBox.Show(ex.Message) End Try

http://www.microsoft.com/spanish/msdn/comunidad/mtj.net/voices/art151.asp (9 of 10)13/04/2007 02:33:51 PM

Aplicando patrones de Diseo en VB .NET

Enriquillo Man se desempea como analista de Sistemas en tecnologa .NET y SQL Server y Asesor Informtico de APLISOFT, S. A. Santo Domingo, Repblica Dominicana, Desde el 1998 trabaja con Tecnologas Microsoft (VB6 y SQL Server), en el Ao 2003 Obtuvo la Certificacin MCSD .NET, Desarrollador 3 Estrellas del Programa DCE.

Bibliografa Design Patterns (Elements of Reusable Object-Oriented Software), Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides.

Enlaces
http://www.dofactory.com Site de Data& Object Factory, implementacin de cada uno de los patrones del libro de GOF en C#. http://www.moisesdaniel.com Diseo de Aplicaciones Internet usan los Patrones de Diseo J2EE (PDF). http://www.teleprogramadores.com

Administre su perfil |Enve esta pagina por e-mail |Suscrbase al MSDN Flash 2007 Microsoft Corporation. Todos los derechos reservados. Aviso Legal |Marcas registradas |Privacidad

http://www.microsoft.com/spanish/msdn/comunidad/mtj.net/voices/art151.asp (10 of 10)13/04/2007 02:33:51 PM

Você também pode gostar