martes, 29 de marzo de 2011

Selección de patrones de diseño

Semana 9
Clase Programación Orientada a Objetos


Patrones de diseño

Los patrones de diseño representan una solución a problemas comunes en el desarrollo de softwares y al diseño de interfaces.
Son métodos probados efectivos en la revolución de problemas, reusables es decir que puedes ser utilizados para resolver problemas parecidos en circunstancias distintas, flexibilidad, estandarización y organización en el código, así como evitar la búsqueda de soluciones a problemas que ya fueron resueltos, entre otras ventajas más.

Categoría de patrones
  • Patrones de arquitectura.-Tratan sobre la estructura fundamental de un sistema de software.
  • Patrones de diseño.-Ayudan con la estructura de diseño de un sistema de software.
  • Dialectos.-Son llamados de bajo nivel porque sirven para algún lenguaje de programación o entorno en especifico.

      • Además también existen los patrones de:
  • Interacción: Ayudan con el diseño de interfaces web.

Plantillas de patrones
Son las características principales que describen a los patrones como: Nombre del patrón, Clasificación del patrón, Intención, También conocido como(otros nombres para el patrón), Motivación, Aplicabilidad, Estructura, Código ejemplo, Usos conocidos, entre otros.

Patrones GoF
Son clasificados de acuerdo a sus objetivos en estructurales, de comportamiento y creacionales.
  • Estructurales: Estos patrones describen como relacionar clases y objetos para formar nuevas estructuras mas grandes y añadir funcionalidades.
  • De comportamiento: Ayudan a definir la comunicación entre los objetos de un sistema.
  • Creacionales: Hablan de la forma de como crear instancias de objetos su propósito es ocultar la manera en que se crea e inicializa un objeto.

Estructurales
  • Adapter(Adaptador): Como su nombre lo dice se encarga de adaptar(en vez de tener que cambiar el código) por ejemplo algún código ya existente en nuestro programa a alguna librería.
  • Bridge(Puente): Separa una abstracción de su implementación.
  • Composite(Objeto compuesto): Deja tratar objetos compuestos como si fueran simples.
  • Decorator(Envoltorio): Proporciona funcionalidades a una clase dinamicamente.
  • Facade(Fachada): Proporciona una interfaz simple para acceder a un grupo de interfaces de un sistema.
  • Flyweight(Peso ligero): Disminuye la repetición cuando muchos objetos poseen información idéntica.
  • Proxy: Es como un intermediario que se encarga de llamar a el método de la clase real pero primero habiendo pasado por el mismo para asegurar que el que llama a el objeto realmente tiene permisos para realizar la acción.

De comportamiento
  • Chain of Responsibility(Cadena de responsabilidad): Deja establecer la linea que necesitan llevar los mensajes para que los objetos sean capaces de realizar la tarea indicada.
  • Command(Orden): Encapsulamiento de una operación en un objeto.
  • Interpreter(Interprete): En un lenguaje, determina una gramática para dicho lenguaje, y las herramientas que se ocupan para interpretarlo.
  • Iterator(Iterador): Deja recorrer objetos compuestos sin importar su implementación.
  • Mediator(Mediador): Especifica como un objeto puede coordinar a objetos de diferentes clases, funcionando como un conjunto.
  • Memento(Recuerdo): Es como un tipo "restauración del sistema".
  • Observer(Observador): Establece dependencias entre objetos, así cuando un objeto cambia se mande un mensaje y se modifiquen los demás objetos relacionados.
  • State(Estado): Deja que un objeto cambie su comportamiento cada vez que se modifique su estado interno.
  • Strategy(Estrategia): Permite tener varios métodos para resolver un problema, y elegir en tiempo de ejecución el método adecuado.
  • Template Method(Método plantilla): Determina en un procedimiento la estructura de un algoritmo, repartiendo en las subclases ciertos pasos.
  • Visitor(Visitante): Define otras operaciones sobre una jerarquía de clases sin cambiar las clases sobre las que funciona.

Creacionales
  • Abstract Factory(Fabrica abstracta): Deja trabajar con objetos de diferentes familias de manera que las familias no se mezclan entre ellas.
  • Builder(Constructor y virtual): Separa el proceso de crear un objeto complejo, enfocando dicho proceso en un punto.
  • Factory Method(Método de fabricación): Crea objetos de una clase de un subtipo determinado.
  • Prototype(Prototipo): Se utiliza para "clonar" objetos.
  • Singleton(Instancia única): Asegura que exista una instancia para una clase y la creación de una forma de acceso global a dicha instancia.

Patrones de diseño en mi Proyecto

*Prototype*

Que como ya lo describí anteriormente, este patrón permite "clonar" instancias de objetos creando nuevos objetos idénticos.
En mi proyecto el Editor de Dibujo lo utilizaría principalmente en la función "copiar" de mi programa. Cuando por ejemplo se selecciona algún objeto un circulo, cuadro, etc. y se quiere crear un objeto exactamente igual. Esa sería la función que yo le daría a el patrón Prototype.


Este patrón permite la creación del objeto en distintas variantes cuando el programa lo necesita, en donde el código que utiliza los objetos, solicitará una copia del objeto que necesite. La copia significa otra instancia del objeto, cada objeto prototipo debe implementar el método clone().


Los participantes
Prototipo: Declara una interfaz para la colación en sí.
ConcretePrototype: Implementa una operación de clonación en sí.
Cliente: Crea un nuevo objeto haciendo un prototipo para clonarse a sí mismo.

Ventajas
  • Añadir y eliminar productos en tiempo de ejecución.
  • Especificar nuevos objetos variando los valores.
  • Especificar nuevos objetos variando la estructura.
  • Reducción de subclases.
  • Configuración de una aplicación con clases dinamicamente.

Aplicado a mi proyecto:



*Factory*

Este es un patrón de diseño que me podría servir para la creación de objetos de un tipo determinado, como las lineas, dibujo libre, cuadros, etc, etc.

Ventajas:
El principal beneficio de utilizar el patrón de la fábrica es que se puede desacoplar los objetos. Usando el método fabrica en lugar de la nueva palabra clave y una clase concreta que permite centralizar la creación de instancias de código en un solo lugar. Esto hace que sea mucho más fácil que cambiar las categorías, o asignar a clases dinámicamente en tiempo de ejecución. También permite una mayor flexibilidad a la hora de subclases.
Todos estos beneficios están relacionados con dos de los principios de diseño orientado a objetos: hacer que sus objetos están debidamente acoplados, y evitar la duplicación de código.

Desventajas:
Es tentador tratar de usar métodos de fábrica en todas partes, en lugar de los constructores normales, pero esto rara vez es útil. La mayoría de creación de instancias de clases es mejor hacerlo al aire libre, con la palabra clave new y un constructor. Esto hace que el código más simple y más fácil de seguir, en lugar de tener que localizar este metodo para ver qué clase se crea una instancia, se puede ver inmediatamente lo que se llama constructor. Pueden ser muy útiles cuando son necesarias, pero asegúrese de no abusar de ellos.

Diagrama de mi proyecto:


*Composite*

Y este patrón me parece que lo podría implementar en mi código en la parte en la que quiero seleccionar algún objeto u objetos que ya haya hecho, ya que la idea que tengo en mente es poder seleccionar ya hechas las figuras cualquiera de ellas, entonces si selecciono varias figuras para copiar todas se copien y se comporte como si fuera un solo objeto, pero que también se puedan separar.
Entonces tengo cada objeto por no repetir todos solo pongo tres que son Cuadrado, Triángulo y Circulo, en donde todos ellos forman un GrupoImagenes que a la vez varios o uno solo GrupoImagenes pueden formar un gráfico.
Este es el diagrama de mi proyecto:

Ventajas:
Mejora la realización de código y facilita la refactorización.
Los objetos compuestos son excelentes estructuras jerárquicas. Cada vez que se ejecuta una operación en un compuesto de alto nivel, que son esencialmente de realizar una búsqueda en profundidad sobre la estructura completa para encontrar los nodos. Es muy fácil añadir, eliminar y buscar los nodos dentro de la jerarquía.

Desventajas:
Puede afectar el rendimiento del programa por el hecho de que cualquier operación llamada en un compuesto se transmite a todos sus hijos, el rendimiento puede sufrir si la jerarquía es demasiado grande ya que no es muy obvio para un programador que el método topGallery.show () inicia un recorrido completo de un árbol.


*Memento*
Este es el ultimo del que hablaré y su uso es bastante obio y aplicable a mi proyecto al menos asi es como lo veo.
Este patron tiene como finalidad guardar un objeto en un momento dado pero de modo que se puedan recuperar los estados anteriores.

Ventajas
Es facil volver a estados anteriores o recientes.

Desventajas
Los mementos son costosos, es costoso crear los objetos Memento si se tiene que almacenar todas las partes del estado del Originator.



Sitios de referencia:
http://www.apwebco.com/gofpatterns/creational/Prototype.html
http://java.ciberaula.com/articulo/diseno_patrones_j2ee/
http://www.apwebco.com/gofpatterns/creational/Prototype.html

1 comentario: