lunes, 24 de noviembre de 2014

PATRONES ESTRUCTURALES

Los patrones de diseño estructurales están enfocados en la gestión de la forma en la que las clases y los objetos se combinan para dar lugar a estructuras más complejas. Al igual que en las otros tipos de patrones, podemos hablar de patrones estructurales asociados a clases (Adapter) y asociados a objetos (Bridge, Composite, Decorator, Facade, Flyweight, Proxy). Los primeros utilizan la herencia mientras que los segundos se basan en la composición. Los patrones estructurales asociados a objetos describen formas de componer los objetos para conseguir nuevas funcionalidades. La flexibilidad de la composición de estos objetos surge de la posibilidad de cambiar dicha composición en tiempo de ejecución, lo que es imposible con la composición estática tradicional de clase.

Adapter

El patrón Adapter convierte la interfaz de una clase en la que otra necesita, permitiendo que clases con interfaces incompatibles trabajen juntas.

Por lo tanto, el uso de este patrón estructural está indicado cuando se quiere usar una clase ya implementada y su interfaz no es similar con la necesitada o cuando se desea crear una clase reusable que coopere con clases no relacionadas o que tengan interfaces compatibles.

Sin embargo, hay que hacer distinción entre si queremos adaptar un objeto o una clase o interfaz completa.
Un adaptador de clase adapta la clase Adaptee a la interfaz de la clase Target, trabajando con una clase adaptada concreta. Por ello, una clase adaptadora no funcionará cuando se desee adaptar, además de la clase objetivo, todas sus subclases.
Sin embargo, un adaptador de objetos permite que un único Adapter trabaje con muchos Adaptees. De este modo, el Adapter también puede agregar funcionalidad a todos los Adaptees de una sola vez.

Los participantes son:

- Client: Es el principal agente en la formación de objetos para la interfaz Target.
- Target: Interfaz del dominio específico que usa el Client.
 -Adaptee: Es la interfaz ya existente que necesita adaptarse.
 - Adapter: Es quien adapta la interfaz del Adaptee a la interfaz Target.



Composite

El patrón Composite sirve para construir objetos que estén formados por tros objetos más simples, pero siempre similares entre sí, gracias a la composición recursiva. Por lo tanto, al tner todos estos objetos una misma interfaz, el Composite simplifica el tratamiento de los mismos.

Los componentes de este patrón son:

- Client: Manipula objetos atravez de la interfaz proporcionada por Component.
- Component: Declara la interfaz para los objetos de la composicion, es la interfaz de acceso y manipulacion de los componentes hijo e implementa algunos comportamientos por defecto.
- Composite: Define el comportamiento de los componentes compuestos, almacena a los hijos e implementa las operaciones de manejo de los componentes.
- Leaf: Definen comportamientos para objetos primitivos del compuesto.

El diagrama de esta clase sería:



PATRONES DE COMPORTAMIENTO

Estos patrones de diseño están relacionados con algoritmos y con la asignación de responsabilidades a los objetos. No describen únicamente patrones de objetos o clases si no que también los patrones de comunicación entre ellos.

Al igual que los otros tipos de patrones, se pueden clasificar en función de que trabajen con clases (Template Method) u otros objetos (Chain of Responsability, Command, Iterator, Mediator, Memento, Observer, State, Strategy, Visitor) 

Algunos de los patrones de diseño de comportamiento son:

Command

Permite realizar una operación sobre un objeto sin conocer las instrucciones de la operación ni e receptor real de la misma, lo cual se consigue encapsulando la petición como si fuera un objeto lo que facilita la parametrización de los métodos.

Las principales aplicaciones del Command son:

- Facilitar la parametrización de las acciones a realizar.
- Implementar las estructuras de callback, especificando ordenes que se quieren ejecutar frente a las situaciones.
- Independizar loa eventos "petición" y "ejecución".
- Dar un soporte factible a la operaciones "deshacer".

Los principales agentes son:

- Command: Declara la interface para la ejecución de la operación.
- ConcretCommand: Define la relación entre el objeto Rceiver y una acción.
- Client: Crea un objeto ConcrteCommand y lo relaciona con su reciver.
- Invoker: Envía las solicitudes al bjeto command.
- Reciver: Gestiona la ejecución de las operaciones asociadas a la solicitud.


domingo, 16 de noviembre de 2014

PATRONES DE CREACIÓN


Estos proporcionan ayuda al momento de crear objetos desde el punto de vista de proporcionar apoyo en la toma de decisiones, incluso cuando esta sea dinámica.

Existen dos formas de clasificar los patrones de diseño basandose en las clases de onjetos que se crean. Una es clasificar las clases que crean los objetos (Factory Method) y la otra esta relacionada con la composición de objetos (definir un objeto que es reponsable de conocer las clases de los objetos producto). En esta caracteristica se apoyan los patrones Abstatrac, factory y Builder.

Ahora definiremos algunos de los patrones de diseño de software e creación mas habituales:

Abstrac Factory

Al encontrarnos frente a un problema en el cual debemos crear diferentes objetos los cuales pertenecen a la misma familia como por ejemplo el sistema de librerías necesarias para crear una interfaz gráfica. Al tener esto podemos decir que lo que intenta solucionar este patron de diseño es realozar la creación de diferentes familias de objetos. El patrón Abstrac Factory se recomienda cuando se visualiza la inclusion de nuevas familias de productos en un futuro, pero resultaría contraproducente añadir nuevos productos o modificar los existentes ya que esto afectaria todas las familias creadas.

Podemos decir que los componentes típicos de este patrón de diseño son: 

- Cliente: Es una entidad que se encarga de llamar a la fabrica adecuada que necesita crear uno de los objetos.

- AbstracFactory: Definición de la interfaz que usará las distintas factorías. Esta debe ofrecer como mínimo un método para poder obtener cada objeto que se deba crear.

- Concrete Factories: Representa las diferentes familias de productos. Provee la instancia concreta del objeto que se pretende crear.

- Abstrasc Product: Se encarga de la implementación especifica de cada producto.

Este es un ejemplo del diagrama de clases general de este patrón:




Factory Method

Esta patrón de diseño consiste en utilizar una clase constructora abstracta con unos métodos defiidos y otros abstractos. 

Este patrón de diseño puede ser utilizado cuando:

- La creación de un objeto impida su reutilización sin una importante duplicidad de código.
- La creación de un objeto requiere acceso a la información o recursos que no deberian estar incluidos en la clase de composición.

Y sus componentes son:

- Product: Define la interfaz del objeto que Factory Method creará.
- ConcreteProduc: Implementa la interfaz product para crear un producto en concreto.
- Creator: Declara el método factory que devuelve un objeto de tipo Product.
- ConcreteCreator: Sobrescribe el método Factory del creator para devolver una instancia de un producto en concreto.

El diagrama de clase de este método sería:



Prototype

Este patrón de diseño sirve para crear duplicados de un objeto, pare ello el patrón debe especificar el tipo de objeto que se desea clonar crando así un prototipo de esa instancia. Esta clase de objetos debe contener en su interfaz el procedimiento que permita solicitar esa copia. 

La principal razón para usar este patrón es crear distintas clases de objetos que necesite el sistema y hacerlo en el momento y entorno adecuado.

El diagrama de clases para este patrón sería:


Los actores que intervienen en este petron son:

- Cliente: Actor que solicita la creación de los nuevos objetos a partir de los prototipos.
- Prototipo concreto: Clase que presenta unas características concretas que serán reproducidas en los nuevos objetos.
- Prototipo: Declara la interfaz a la que accede el cliente y sirve para la clonación de objetos.

Singleton

Este patrón busca restringir la creación de objectos pertenecientes a una clase o valor de un tipo a un único objeto. Su intención es garantizar que una clase sea instanciada solo una vez.

Para implementar este patrón es necesario crear un método que instancie al objeto en caso que no exista una instancia creada. Para garantizar que no vuelva a ser instanciado se limita al constructor con atributos protegidos o privados.

El diagrama de esta clase sería:





PATRONES DE DISEÑO


Los patrones de diseño son soluciones ya probadas y documentadas a problemas de desarrollo de software. También identifican las instancias y clases que participan en dicho patrón, así como sus papeles, realciones y responsabilidades para levar a cabo la tarea a resolver.

Cada patrón de diseño se centra en resolver un problema particular en la programación orientada a objetos. Describe cuando puede aplicarese, si puede ser aplicado desde el punto de vista de las limitaciones del diseño y las consecuencias positivas y negativas que tiene su utilización.

Es importante tener presente los siguientes elementos de un patrón:
  • Nombre.
  • Clasificación.
  • Intención (Que hace).
  • También conocido como (otro nombres).
  • Motivación(Escenario que ilustra el funcionamiento).
  • Aplicabilidad (En que escenario es valido).
  • Estructura (Ilustración gráfica).
  • Participantes (Clases, objetos y sus responsabilidades).
  • Consecuencias (¿Como el patrón realiza su cometido? ¿Cuales son los compromisos a tener en cuenta para aceptar la solución?).
  • Implementación (Dificultades, riesgos,pistas o técnicas para tener en cuenta a la hora de implementar el patrón).
  • Ejemplo de código.
Antes de considerar una solución como un patrón debe debe tener las siguientes características:

    1. Efectivo resolviendo problemas similares en ocasiones anteriores.
    2. Reutilizable: aplicable a diferentes problemas de diseño en distintas circunstancias
Existen varios patrones de diseños los cuales se clasifican de la siguiente manera:

  • Patrones creacionales: Son utilizados para instanciar objetos y separar la implementación del cliente de la de los objetos que se utilizan. Con esto se intenta separar la lógica  de creación de objetos y encapsularla.
  • Patrones de comportamiento: Se utilizan para definir como se interelacionan las clases y los objetos.
  • Patrones estructurales: Se utilizan para crear clases y objetos dentro de estructuras más complejas.