miércoles, 23 de mayo de 2012

Patrones de diseño

¿Qué son los patrones de diseño?


Se entiende por patrones de diseño a soluciones limpias y elegantes a problemas conocidos. Hay patrones de creación, patrones estructurales y patrones de comportamiento. 

Patrones de creación:

  • Abstract Factory 
  • Builder
  • Factory Method
  • Prototype
  • Singleton




Abstract Factory
Proporciona una interfaz para crear familias de objetos que dependen entre sí, sin especificar sus clases concretas. El problema que intenta solucionar este patrón es el de crear diferentes familias de objetos.


El patrón Abstract Factory está aconsejado cuando se prevé la inclusión de nuevas familias de productos, pero puede resultar contraproducente cuando se añaden nuevos productos o cambian los existentes, puesto que afectaría a todas las familias creadas.





Estructura 

Cliente: es la clase que usará la factoría adecuada para crear instancias concretas de objetos..
AbstractFactory: define la interfaz de las factorías concretas. Expone métodos para la obtención de cada objeto que puede crear.
Factorías Concretas: diferentes factorías de objetos. Devuelve instancias concretas.
Objeto abstracto: define la interfaz que luego implementarán los objetos concretos. El cliente trabajará directamente sobre esta interfaz y no con los objetos concretos.
Objeto concreto: iplementación concreta de los diferentes productos. El cliente no sabrá si usa unos objetos de un tipo o de otro puesto que trabajará directamente sobre la superclase o interfaz.


Builder
Separa la construcción de un objeto complejo de su representación, de forma que el mismo proceso de construcción pueda crear diferentes representaciones. A menudo, el patrón builder construye el patrón Composite, un patrón estructural explicado más adelante.



El patrón Builder (Contructor) centraliza el proceso de creación en un único punto, de tal forma que el mismo proceso de construcción pueda crear representaciones diferentes.


Estructura:
Builder: es la interfaz abstracta para crear productos.
Concrete Builder: es la implementación del Builder, construye y reúne las partes necesarias para construir los productos
Director: construye un objeto usando el patrón Builder
Producto: El objeto complejo bajo construcción

Ventajas:
•Reduce el acoplamiento.
•Permite variar la representación interna de estructuras compleja, respetando la interfaz común de la clase Builder.
•Se independiza la creación de la representación. Las clases concretas que tratan las representaciones internas no forman parte de la interfaz del Builder.
•Cada ConcreteBuilder tiene el código especifico para crear y modificar una estructura interna concreta.
•Distintos Director´s con distintas responsabilidades pueden utilizar el mismo ConcreteBuilder.
•Permite un mayor control en el proceso de creación del objeto. El Director controla la creación paso a paso, solo cuando el Builder ha terminado de construir el objeto lo recupera el Director.

  
Factory Method
Define una interfaz para crear un objeto, pero deja que sean las subclases quienes decidan qué clase instanciar. Permite que una clase delegue en sus subclases la creación de objetos. Es una simplificación del Abstract Factory, en la que la clase abstracta tiene métodos concretos que usan algunos de los abstractos; según usemos una u otra hija de esta clase abstracta, tendremos uno u otro comportamiento.



  
Prototype
Especifica los tipos de objetos a crear por medio de una instancia prototípica, y crea nuevos objetos copiando este prototipo. Este patrón resulta útil en escenarios donde es preciso abstraer la lógica que decide qué tipos de objetos utilizará una aplicación, de la lógica que luego usarán esos objetos en su ejecución. 




Singleton
Garantiza que una clase sólo tenga una instancia, y proporciona un punto de acceso global a ella. 

El patrón singleton provee una única instancia global gracias a que:

  • La propia clase es responsable de crear la única instancia.
  • Permite el acceso global a dicha instancia mediante un método de clase.
  • Declara el constructor de clase como privado para que no sea instanciable directamente.
Veamos varias implementaciones:

Lazy initialization


public class Singleton {


        private static Singleton _instance; 
        private Singleton() {  } 


        public static synchronized Singleton getInstance() {
                if (null == _instance) {
                        _instance = new Singleton();
                }
                return _instance;
        }
}


Traditional simple way
public class Singleton {


        private static final Singleton instance = new Singleton();

        // Private constructor prevents instantiation from other classes
        private Singleton() { }

        public static Singleton getInstance() {
                return instance;
        }
}


The solution of Bill Pugh
public class Singleton {
        // Private constructor prevents instantiation from other classes
        private Singleton() { }
        private static class SingletonHolder { 
                public static final Singleton instance = new Singleton();
        }

        public static Singleton getInstance() {
                return SingletonHolder.instance;
        }
}

[TODAVÍA ESTOY TRABAJANDO EN ESTA ENTRADA PERO QUERÍA PUBLICARLA YA]

Patrones estructurales:

  • Adapter
  • Bridge
  • Composite
  • Decorator
  • Facade
  • Flyweight
  • Proxy


AdapterConvierte la interfaz de una clase en otra distinta que es la que esperan los clientes. Permiten que cooperen clases que de otra manera no podrían por tener interfaces incompatibles.
  
Bridge
Desvincula una abstracción de su implementación, de manera que ambas puedan variar de forma independiente.


CompositeCombina objetos en estructuras de árbol para representar jerarquías de parte-todo. Permite que los clientes traten de manera uniforme a los objetos individuales y a los compuestos.

Decorator
Añade dinámicamente nuevas responsabilidades a un objeto, proporcionando una alternativa flexible a la herencia para extender la funcionalidad.

 • FacadeProporciona una interfaz unificada para un conjunto de interfaces de un subsistema. Define una interfaz de alto nivel que hace que el subsistema sea más fácil de usar.


Flyweight
Usa el compartimiento para permitir un gran número de objetos de grano fino de forma eficiente.


Proxy
Proporciona un sustituto o representante de otro objeto para controlar el acceso a éste.


Patrones de comportamiento:

  • Chain of Responsibility
  • Command
  • Interpreter
  • Iterator
  • Mediator
  • Memento
  • Observer
  • State
  • Strategy
  • Template Method
  • Visitor



Chain of Responsibility
Evita acoplar el emisor de una petición a su receptor, al dar a más de un objeto la posibilidad de responder a la petición. Crea una cadena con los objetos receptores y pasa la petición a través de la cadena hasta que esta sea tratada por algún objeto.
  
Command
Encapsula una petición en un objeto, permitiendo así parametrizar a los clientes con distintas peticiones, encolar o llevar un registro de las peticiones y poder deshacer la operaciones.
  
Interpreter
Dado un lenguaje, define una representación de su gramática junto con un intérprete que usa dicha representación para interpretar las sentencias del lenguaje.
  
Iterator
Proporciona un modo de acceder secuencialmente a los elementos de un objeto agregado sin exponer su representación interna.
  
Mediator
Define un objeto que encapsula cómo interactúan un conjunto de objetos. Promueve un bajo acoplamiento al evitar que los objetos se refieran unos a otros explícitamente, y permite variar la interacción entre ellos de forma independiente.
  
Memento
Representa y externaliza el estado interno de un objeto sin violar la encapsulación, de forma que éste puede volver a dicho estado más tarde.
  
Observer
Define una dependencia de uno-a-muchos entre objetos, de forma que cuando un objeto cambia de estado se notifica y actualizan automáticamente todos los objetos.
  
State
Permite que un objeto modifique su comportamiento cada vez que cambia su estado interno. Parecerá que cambia la clase del objeto.

 • Strategy
Define una familia de algoritmos, encapsula uno de ellos y los hace intercambiables. Permite que un algoritmo varíe independientemente de los clientes que lo usan.
  
Template Method
Define en una operación el esqueleto de un algoritmo, delegando en las subclases algunos de sus pasos. Permite que las subclases redefinan ciertos pasos del algoritmo sin cambiar su estructura.

 • Visitor
Representa una operación sobre los elementos de una estructura de objetos. Permite definir una nueva operación sin cambiar las clases de los elementos sobre los que opera.



Author
Juan García Carmona