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:



viernes, 3 de enero de 2014

Patrón Flyweight. Ejemplo Formatos de tipo de letra y tamaño


Patrón Flyweight


Motivo 
Este patrón comparte estados para soportar un gran número de objetos pequeños aumentando la eficiencia en espacio. [Gamma,1995]

Algunas aplicaciones pueden usar objetos durante todo su diseño, pero esto puede ocasionar implementaciones costosas. Ejemplo: La mayoría de editores de documentos tienen formato de texto y facilidades de edición que son implementados por alguna extensión. Típica mente editores de documento orientados a objetos usan objetos para representar elementos embebidos como tablas o figuras, así también utilizan objetos para representar cada carácter, manejar el editor de esta manera ofrece flexibilidad al sistema, pues pueden ser dibujados y formateados uniformemente, con figuras y tablas, pero la desventaja es que un documento de texto puede tener miles de caracteres, por eso tener un objeto por carácter implica un gran costo debido a la memoria que puede consumir. Flyweight permite compartir objetos ligeros, para hacer el programa más liviano. Para conseguir esto se utilizan objetos que almacenan los estados compartidos y que pueden ser usados por varios objetos simultáneamente. Los objetos pueden compartir estados intrínsecos que no dependen del contexto, pero no pueden compartir los estados extrínsecos que dependen del contexto

  • El estado intrínseco es almacenado en el objeto.
  • El estado extrínseco es pasado (contexto) como parámetro en las operaciones.



Aplicabilidad 

La efectividad de este patrón depende de cómo y cuándo es utilizado, por eso es importante implementarlo siempre que todas las siguientes situaciones se cumplan: 
  • Una aplicación usa un gran número de objetos. 
  • El coste de almacenamiento es alto debido al excesivo número de objetos. 
  •  La gran mayoría de los estados de los objetos puede hacerse extrínseco. 
  • Al separar el estado extrínseco, muchos grupos de objetos pueden reemplazarse por unos pocos objetos compartidos. 
  • La aplicación no depende de la identidad de los objetos, pues el patrón se basa en el compartimento de objetos. 


Implementación:

  1. Asegurarse que la sobrecarga de objeto es un tema que necesita atención y el cliente de la clase es capaz y está dispuesto a absorber la responsabilidad de reajuste.
  2. Dividir la clase de estado de destino en: Estado compartible (intrínseco) y estado no compartible (extrínseco).
  3. Quitar el estado no compartible de los atributos de clase y agregarlo como argumento de llamada a la lista de métodos afectados.
  4. Crear un Factory que pueda almacenar en caché y reutilizar instancias de clases existentes.
  5. El cliente debe usar el Factory en lugar del operador new.
  6. El cliente (o un tercero) debe observar o calcular el estado no compartible y suministrar el estado a través de métodos de clase.


Relación con otros patrones
Mientras el patrón Flyweight muestra cómo hacer gran cantidad de pequeños objetos, Facade cómo hacer un único objeto representativo de un subsistema completo.
Flyweight es a menudo combinado con Composite para implementar nodos compartidos.
Flyweight explica cómo y cuándo objetos State pueden ser compartidos.

Diagrama UML:



Flyweight: declara una interfaz a través de la cual los flyweights pueden recibir y actuar sobre los estados no compartidos.
ConcreteFlyweight: implementa la interfaz Flyweight y almacena los estados compartidos, si los hay. Un objeto ConcreteFlyweight debe ser compartible. Cualquier estado que almacene debe ser intrínseco; es decir, debe ser independiente de su contexto.
UnsharedConcreteFlyweight: no todas las subclases de Flyweight tienen por qué ser compartidas. La interfaz Flyweight permite que se comparta; no lo fuerza. Es común que los objetos de esta clase tengan hijos de la clase ConcreteFlyweight en algún nivel de su estructura.
FlyweightFactory: crea y gestiona los objetos flyweight. Garantiza que los objetos flyweight se comparten de forma apropiada. Cuando un cliente solicita un flyweight, el objeto de la clase FlyweightFactory proporciona una instancia existente, o crea una.
Client: contiene referencias a los flyweights. Calcula o almacena los estados no compartidos de los flyweights.


Ejemplo: Formatos de tipo de letra y tamaño.
En este ejemplo se reciben varios tipos de letras, tamaño y texto. El programa se encargará de crear las clases formatos,  donde almacenará los distintos tipos de letras y tamaños.
Esquema de clases:

Esquema del proyecto:



Clase CreaLetra
->

Clase Formato
->

Clase FormatoFactory
->

Clase Letra
->

Clase TestFlyWeight
->

Programa Principal:
->


Salida del programa por consola:
->

Fuente: archivo almacenado en box.com

http://modelosprogramacion.blogspot.com.es/2009/05/flyweight.html
http://adrysmodelos.blogspot.com.es/2009/05/patron-de-diseno-flyweight-abstract.html -> ejemplo de caracteres
http://programacionsolida.com.ar/2012/03/patrones-de-diseno-estructurales_22.html

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.
->

Clase LCD:
El método clone() lo redefinimos segun las propiedades de los tv del tipo LCD ->

Clase Plasma:
El método clone() lo redefinimos segun las propiedades de los tv del tipo Plasma ->

Clase TVPrototype:
En esta clase, predefinimos los distintos tipos que va a tener el cliente disponible.
->

Programa Principal:
->

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

miércoles, 1 de enero de 2014

Gambas3: Como extraer el contenido de una pagina web (parsear)

Gambas3

Como extraer contenido 

de una pagina web (parsear)


Os dejo 2 maneras de extraer el contenido de una una página web y tenerlo almacenado en una variable tipo cadena (string) en nuestro programa, que posteriormente podremos analizar.


Método 1: usando el comando externo wget
->
Método 2: usando la clase HttpClient
->
Nota:
Para usar la clase HttpClient debeis de activa el componente gb.net.curl:
(menu Proyecto/Propiedades/pestaña Componentes)


Ejemplo de aplicación:
Os dejo un simple ejemplo de aplicación que extrae y muestra el contenido de una pagina web de las dos formas.
Tiene dos botones que extraen el contenido de las formas anteriormente explicada, un textbox donde pondremos la dirección Url que queremos descargar y un control Editor, donde mostramos el contenido extraido coloreado automaticamente.
->

Captura de la aplicación en funcionamiento:


Enlace de descarga: descarga desde Box

Otro ejemplo: http://jsbsan.blogspot.com.es/2011/10/updaterayo-nueva-clase-up-poder-buscar.html


Saludos