jueves, 1 de enero de 2015

¿Que es Patrones De Diseño?


Esta fue la primer pregunta que me hice cuando comencé a investigar sobre este tema. Al principio no tenía mucha idea de por dónde comenzar, por lo que mi primera reacción fue realizar una búsqueda en Internet y obtener de esta manera alguna base sobre la cual apoyarme. La definición que más me gustó fue la siguiente:
“Los patrones de diseño son el esqueleto de las soluciones a problemas comunes en el desarrollo de software.”
En otras palabras, brindan una solución ya probada y documentada a problemas de desarrollo de software que están sujetos a contextos similares. Debemos tener presente los siguientes elementos de un patrón: su nombre, el problema (cuando aplicar un patrón), la solución (descripción abstracta del problema) y las consecuencias (costos y beneficios).
Grande fue mi sorpresa al averiguar que existen varios patrones de diseño popularmente conocidos, los cuales se clasifican como se muestra a continuación:
  • Patrones Creacionales: Inicialización y configuración de objetos.
  • Patrones Estructurales: Separan la interfaz de la implementación. Se ocupan de cómo las clases y objetos se agrupan, para formar estructuras más grandes.
  • Patrones de Comportamiento: Más que describir objetos o clases, describen la comunicación entre ellos.
Veamos un poco en qué consisten los distintos tipos de patrones, cuáles son sus fines y qué beneficios nos aportan.

lunes, 3 de noviembre de 2014

Adapter

Permite la cooperación entre clases para extender sus funcionalidades a clases de diferentes tipos, que no pueden usarlas por mecanismos comunes como la herencia.



Problema : Cuando se quiere utilizar una clase existente, pero su interfaz no es compatible o no esta relacionada con la clase que la va a utilizar.
Solución: Utilizando el patrón Adapter podemos relacionar clases incompatibles entre si, generando un mecanismo que permita extender su comportamiento por medio de una clase puente que sirva como interfaz entre la clase en cuestión y el resto de clases que quieran hacer uso de sus funcionalidades.

Decorator


El Patrón Decorator Permite agregar funcionalidades y responsabilidades a objetos de forma dinámica y transparente para el usuario, esto se realiza por medio de relaciones con otras clases extendiendo su funcionalidad al incorporar las de las clases asociadas, de esta forma el patrón no es dependiente de la Herencia ya que aunque esta puede jugar un papel importante, prevalece el uso de conceptos como la composición al momento de definir comportamientos.


Como vemos en el diagrama de clases, tenemos una SuperClase de la cual heredan clases concretas y las clases Decoradoras que a su vez también pueden ser clases padre de clases decoradoras Concretas...... ¿Que?...
¿Pero si dijimos que el patrón no es dependiente de la herencia porque hablamos de SuperClases?
La pregunta anterior es muy común, ya que puede llegar a ser muy confusa la definición, sin embargo la respuesta es muy simple, con el Decorator la herencia es requerida ya que los decoradores deben tener el mismo tipo de los objetos a decorar pero no se utiliza la Herencia para lograr el comportamiento.... el comportamiento se da al realizar la composición de decoradores con los componentes concretos.....(Cuando Hablamos de comportamiento, nos referimos a las nuevas funcionalidades que usamos...).

VO Y DAO


Value Object

Consiste básicamente en la agrupación de datos dentro de un objeto, estos datos representan los campos de una tabla o entidad de la BD y facilitan su mantenimiento y transporte dentro del sistema.
   

Problema : Al momento de pasar argumentos de un objeto a un método puede ocasionar que el método reciba gran cantidad de datos pasados como parámetros, si posteriormente se requiere la modificación de uno de esos argumentos se obliga a que todos los métodos que reciban estos argumentos sean cambiados, presentándose problemas de acoplamiento y mantenibilidad.
Solución: Se crean clases que representan las tablas de la BD que utiliza el sistema, de esta manera las propiedades o atributos de la clase serán los campos de la entidad, permitiendo encapsular la información y facilitando la manera en que estos son transportados, así al momento de enviar los parámetros a un método, se envía un                                    solo objeto que los contiene.

Data Access Object (DAO) 
Facilita y estructura el acceso a la información de una Base de Datos, separando la persistencia de objetos de la lógica de acceso a datos, brindando mayor flexibilidad ya que por ejemplo al momento de hacer un cambio en la lógica de negocio, esto seria transparente para la lógica de acceso a la información.

Problema : Se tienen diferentes implementaciones para el acceso a datos, de esta manera al cambiar el proveedor de  BD o la forma de conexión puede afectar la manera de acceder a los datos teniendo que implementar nuevamente el proceso en todos los componentes vinculados.
Solución: Se utilizan clases DAO para encapsular todos los accesos a la fuente de datos desacoplando de esta manera la lógica de negocio de la lógica de acceso a datos, estableciendo mayor organización y facilitando la mantenibilidad y extensibilidad del código fuente.


Observer



Es un patrón de diseño que define una dependencia del tipo uno-a-muchos entre objetos, de manera que cuando uno de los objetos cambia su estado, notifica este cambio a todos los dependientes. Básicamente debemos saber que el patrón Observer es un patrón de comportamiento que permite relacionar diferentes objetos entre si en torno a uno Principal, así cada vez que este ultimo cambie su estado, los demás también cambiaran de forma automática.



Ejemplo:

Podemos decir entonces que dicho patrón se compone de un objeto observable u Observado (SujetoConcreto) y objetos observadores (ObservadorConcreto)....

Un  Objeto Observable puede tener uno o mas Observadores, como vemos elObservadorConcreto implementa la interface Observer (propia de Java) la cual permite informar sobre los cambios en los objetos observables mediante una llamada al método update()...

java también nos proporciona la Clase Observable de la cual extienden las clases o sujetos concretos (los observados), esta clase provee varios métodos importantes como por ejemplo registerObserver(), removeObserver(),notifyObservers() entre otros necesarios para el funcionamiento del patrón, mas adelante en nuestro ejemplo veremos como lo podemos usar.





Modelo Vista Controlador (MVC)



También es un patrón estructural que permite separar la información y lógica de negocio de la parte visual de la aplicación y la lógica que gestiona las relaciones y eventos del sistema. es decir, por un lado define componentes para la representación de la información, y por otro lado para la interacción del usuario. Este patrón de arquitectura de software se basa en las ideas de reutilización de código y la separación de conceptos, características que buscan facilitar la tarea de desarrollo de aplicaciones y su posterior mantenimiento.




  • Modelo : Representa la información y los datos procesados por el sistema, gestionando la forma como se accede a estos y la lógica de negocio de la aplicación. 
  • Controlador : Representa el puente de interacción entre el Modelo y la Vista, define la forma como se relacionan los componentes de la aplicación. 
  • Vista : Es la representación del modelo mediante una interfaz gráfica de usuario, es la forma como el usuario interactúa con el sistema, permitiendo la ejecución de eventos he ingreso de información que serán procesados por el Modelo.



jueves, 30 de octubre de 2014

Método de Fabricación ( Factory Method )

¿Que es?
el patrón de diseño Factory Method consiste en utilizar una clase constructora (al estilo del Abstract Factory) abstracta con unos cuantos métodos definidos y otro(s) abstracto(s): el dedicado a la construcción de objetos de un subtipo de un tipo determinado.

Parte del principio de que las subclases determinan la clase a implementar.

public class ConcreteCreator extends Creator

  {
  protected Product FactoryMethod()
      {
            return new ConcreteProduct();
      }
}
public interface Product{}
public class ConcreteProduct implements Product{}
      public class Client
      {
            public static void main(String args[])
            {
                  Creator UnCreator;
                  UnCreator = new ConcreteCreator();
                  UnCreator.AnOperations();
            }
      }