Dedicado a mis proyectos en Gambas ,un lenguaje de programación parecido al Visual Basic + Java pero ampliamente mejorado y...¡¡para gnu/linux!!.La potencia del gnu/linux sumada a la facilidad del Basic



Consultas, Desarrollo de programas y petición de presupuestos:



jueves, 2 de enero de 2014

Patrón Prototype. Ejemplo tipos de televisiones.




Patrón Prototype.

 Ejemplo tipos de televisiones.





"El patrón prototype tiene  como finalidad crear nuevos objetos duplicándolos, clonando una instancia creada previamente."
Se usa en un escenario donde sea necesario la creación de objetos parametrizados como "recién salidos de fábrica" ya listos para utilizarse, con la gran ventaja de la mejora de la performance: clonar objetos es más rápido que crearlos y luego darles valor a cada parametro en particular.
Este patrón debe ser utilizado cuando un sistema posea objetos con datos repetitivos, en cuanto a sus atributos: por ejemplo, si una biblioteca posee una gran cantidad de libros de una misma editorial, mismo idioma, etc. Hay que pensar en este patrón como si fuese un fábrica que tiene ciertas plantillas de ejemplos de sus productos y, a partir de estos prototipos, puede crear una gran cantidad de productos con esas características.


Diagrama UML:
Esquema UML

Prototype: declara la interface del objeto que se clona. Suele ser una clase abstracta.
PrototypeConcreto:las clases en este papel implementan una operación por medio de la clonación de sí mismo.
Cliente: crea nuevos objetos pidiendo al prototipo que se clone.

Los objetos de Prototipo Concreto heredan de Prototype y de esta forma el patrón se asegura de que los objetos prototipo proporcionan un conjunto consistente de métodos para que los objetos clientes los utilicen.



Ejemplo:
Vamos a crear una clase de  prototipos de TVs. Para ello crearemos la clase TV y dos subclases: LCD y Plasma.   Según este esquema:




Clase TV:
Esta clase tiene el método Clone() que se encarga de hacer una copia de si misma y de devolverla.
->
Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. ' Gambas class file
  2.  
  3. Property marca As String
  4.  
  5. Private hmarca As String
  6.  
  7. Property pulgadas As Integer
  8. Private hpulgadas As Integer
  9.  
  10. Property colores As String
  11.  
  12. Private hcolores As String
  13.  
  14. Property precio As String
  15. Private hprecio As Float
  16.  
  17. Public Sub _new(m As String, pul As Integer, c As String, pre As Float)
  18.  
  19.   Me.marca = m
  20.   Me.pulgadas = pul
  21.   Me.precio = pre
  22.   Me.colores = c
  23.  
  24. End
  25.  
  26. Public Function clone() As Tv
  27.   'creo una copia de mi mismo con mis datos y la retorno
  28.  
  29.   Dim tvtemp As New Tv(hmarca, hpulgadas, hcolores, hprecio)
  30.  
  31.   Return tvtemp
  32.  
  33. End
  34.  
  35. Private Function marca_Read() As String
  36.  
  37.   Return hmarca
  38.  
  39. End
  40.  
  41. Private Sub marca_Write(Value As String)
  42.  
  43.   hmarca = value
  44.  
  45. End
  46.  
  47. Private Function pulgadas_Read() As Integer
  48.  
  49.   Return hpulgadas
  50.  
  51. End
  52.  
  53. Private Sub pulgadas_Write(Value As Integer)
  54.  
  55.   hpulgadas = value
  56.  
  57. End
  58.  
  59. Private Function precio_Read() As String
  60.  
  61.   Return hprecio
  62.  
  63. End
  64.  
  65. Private Sub precio_Write(Value As String)
  66.  
  67.   hprecio = value
  68.  
  69. End
  70.  
  71. Private Function colores_Read() As String
  72.  
  73.   Return hcolores
  74.  
  75. End
  76.  
  77. Private Sub colores_Write(Value As String)
  78.  
  79.   hcolores = value
  80.  
  81. End


Clase LCD:
El método clone() lo redefinimos segun las propiedades de los tv del tipo LCD ->
Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. ' Gambas class file
  2.  
  3. Inherits TV
  4. Property costoFabricacion As Float
  5. Private hcostoFabricacion As Float
  6.  
  7. Public Sub _new(costoFab As Float)
  8.  
  9.   hcostoFabricacion = costoFab
  10.  
  11. End
  12.  
  13. Private Function costoFabricacion_Read() As Float
  14.  
  15.   Return hcostoFabricacion
  16.  
  17. End
  18.  
  19. Private Sub costoFabricacion_Write(Value As Float)
  20.  
  21.   hcostoFabricacion = Value
  22.  
  23. End
  24.  
  25. Public Function clone() As Tv
  26.   'creo una copia de mi mismo con mis datos y la retorno
  27.  
  28.   Dim tvtemp As New LCD(Super.marca, Super.pulgadas, Super.colores, Super.precio, hcostoFabricacion)
  29.  
  30.   Return tvtemp
  31.  
  32. End


Clase Plasma:
El método clone() lo redefinimos segun las propiedades de los tv del tipo Plasma ->
Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. ' Gambas class file
  2.  
  3. Inherits TV
  4.  
  5. Property angulovision As Float
  6.  
  7. Private hangulovision As Float
  8.  
  9. Property tiempoRespuesta As Float
  10. Private htiempoRespuesta As Float
  11.  
  12. Public Sub _new(angvision As Float, tiempoRes As Float)
  13.  
  14.   hangulovision = angvision
  15.   htiempoRespuesta = tiempoRes
  16.  
  17. End
  18.  
  19. Public Function clone() As Tv
  20.   'creo una copia de mi mismo con mis datos y la retorno
  21.  
  22.   Dim tvtemp As New Plasma(Super.marca, Super.pulgadas, Super.colores, Super.precio, hangulovision, htiempoRespuesta)
  23.  
  24.   Return tvtemp
  25.  
  26. End
  27.  
  28. Private Function angulovision_Read() As Float
  29.  
  30.   Return hangulovision  
  31.  
  32. End
  33.  
  34. Private Sub angulovision_Write(Value As Float)
  35.  
  36.   hangulovision = Value
  37.  
  38. End
  39.  
  40. Private Function tiempoRespuesta_Read() As Float
  41.  
  42.   Return htiempoRespuesta
  43.  
  44. End
  45.  
  46. Private Sub tiempoRespuesta_Write(Value As Float)
  47.  
  48.   htiempoRespuesta = Value
  49.  
  50. End


Clase TVPrototype:
En esta clase, predefinimos los distintos tipos que va a tener el cliente disponible.
->
Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. ' Gambas class file
  2.  
  3. Private listaTv As New Collection
  4.  
  5. Public Sub _new()
  6.  
  7.   Dim p As New Plasma("Sony", 21, "Plateado", 399.99, 90, 0.05)
  8.   Dim lcd1 As New LCD("Panasonic", 42, "Plateado", 599.99, 290)
  9.  
  10.   listaTv.Add(p, "Plasma")
  11.  
  12.   listaTv.Add(lcd1, "Lcd")
  13.  
  14. End
  15.  
  16. Public Function prototipo(tipo As String) As TV
  17.  
  18.   Return listaTv[tipo].clone()
  19.  
  20. End


Programa Principal:
->
Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. ' Gambas class file
  2.  
  3. Public Sub Form_Open()
  4.  
  5.   Dim tvp As New TvPrototype
  6.  
  7.   'voy a crear varios tv tipo Plasma usando el TvPrototype....
  8.  
  9.   Dim tv1 As Plasma
  10.   Dim tv2 As Plasma
  11.   Dim tv3 As Plasma
  12.   Dim tv4 As Plasma
  13.  
  14.   tv1 = tvp.prototipo("Plasma")
  15.   tv2 = tvp.prototipo("Plasma")
  16.   TextArea1.text &= "Muestro Clones iniciales:" & gb.CrLf
  17.   TextArea1.text &= "Clone tv1: " & tv1.marca & " " & tv1.precio & gb.CrLf
  18.   TextArea1.text &= "Clone tv2:" & tv2.marca & " " & tv2.precio & gb.CrLf
  19.  
  20.   TextArea1.text &= "Cambio datos  del tv2, para comprobar que tv1 no cambia:" & gb.CrLf
  21.   tv2.marca = "Panasonic"
  22.   TextArea1.text &= "Clone tv1: " & " " & tv1.marca & " " & tv1.precio & gb.CrLf
  23.   TextArea1.text &= "Clone tv2:" & " " & tv2.marca & " " & tv2.precio & gb.CrLf
  24.  
  25.   tv3 = tvp.prototipo("Plasma")
  26.   TextArea1.text &= "añado un nuevo television tv3, veo sus datos... " & gb.CrLf & "y muestro los tv anteriores para comprobar que el prototipo sigue funcionando:" & gb.CrLf
  27.   TextArea1.text &= "Clone tv1: " & " " & tv1.marca & " " & tv1.precio & gb.CrLf
  28.   TextArea1.text &= "Clone tv2:" & " " & tv2.marca & " " & tv2.precio & gb.CrLf
  29.   TextArea1.text &= "Clone tv3:" & " " & tv3.marca & " " & tv3.precio & gb.CrLf
  30.  
  31.   TextArea1.Text &= "Voy a clonar tv3, creando tv4:" & gb.CrLf
  32.   tv4 = tv3.clone()
  33.  
  34.   TextArea1.text &= "Clone tv3:" & " " & tv3.marca & " " & tv3.precio & " " & tv3.angulovision & gb.CrLf
  35.   TextArea1.text &= "Clone tv4:" & " " & tv4.marca & " " & tv4.precio & " " & tv4.angulovision & gb.CrLf
  36.   TextArea1.text &= "Modifico una de las propiedades del angulovision del tv4:" & gb.CrLf
  37.   tv4.angulovision = 45
  38.   TextArea1.text &= "Clone tv3:" & " " & tv3.marca & " " & tv3.precio & " " & tv3.angulovision & gb.CrLf
  39.   TextArea1.text &= "Clone tv4:" & " " & tv4.marca & " " & tv4.precio & " " & tv4.angulovision & gb.CrLf
  40.  
  41. End


Ejemplo de la aplicación funcionando:



enlace de descarga del ejemplo completo: enlace desde box.com




Fuente:
http://migranitodejava.blogspot.com.es/search/label/Prototype