Introducción a los patrones de diseño

Comments

Breve introducción a los diferentes patrones de diseño que podemos encontrar en el mundo de la programación

Patrones de diseño

Introducción

En el desarrollo de sistemas, la mayoría de los programadores hoy en día, utilizan como metodología, la Programación Orientada a Objetos, de aquí en adelante, lo abreviaremos con sus siglas POO. Sabemos que programar en POO, no es muy sencillo, cuando los desarrollos tienden a complejizarse, el programador no experimentado no es capaz de determinar que clases elaborar. Los conceptos de la POO, no adquieren mayores dificultades a la hora de estudiarlos, el problema radica en como aplicar eficientemente estos conceptos en el desarrollo de aplicaciones medianamente complejas. Para facilitar el desarrollo, existen una serie de patrones, utilizados por una gran mayoría de desarrolladores experimentados, con el propósito de diseñar la arquitectura de sus proyectos.

En esta guía, vas a aprender a utilizar los diferentes patrones de diseño que podemos encontrar. Usted puede implementar estos patrones, en sus proyectos a medida que su aplicación lo requiera. Debes tener en cuenta, que cada aplicación es diferente, por lo tanto, su comportamiento y su jerarquía de clases será diferente, por eso es indispensable antes que nada, evaluar cual es el patrón de diseño que mejor se adapte a nuestra solución.

Organización de la guía

Antes de comenzar a definir cada uno de los patrones de diseño, comentaré como será nuestro espacio de trabajo. En primer lugar, cada patrón será definido utilizando un ejemplo básico desarrollado en Java y a continuación, implementaré el patrón en una aplicación real.

La aplicación a desarrollar será una tienda online realizada en PHP y a medida que irás aprendiendo cada patrón, actualizaremos la tienda con el patrón correspondiente. Por lo tanto, si bien puedes estudiar los mismos por separado, para seguir el avance de esta tienda, te recomiendo que leas la presente guía en orden.

Strategy (Estrategia)

El Patrón de Estrategia define una familia de algoritmos, encapsula cada uno y los hace intercambiables. La estrategia permite que el algoritmo varíe independientemente de los clientes que lo utilizan.

Observer (Observador)

El Patrón de observador define una dependencia de uno a muchos entre objetos, de modo que cuando un objeto cambia de estado, todos sus dependientes son notificados y actualizados automáticamente.

Abstract Factory (Fábrica Abstracta)

Proporciona una interfaz para crear familias de objetos relacionados o que dependen entre sí.

Adapter (Adaptador)

Convierte la interfaz de una clase en otra distinta que es la que esperan los clientes. Permite que cooperen clases que de otra manera no podrían por tener interfaces incompatibles.

Bridge (Puente)

Desacopla una abstracción de su implementación, de manera que ambas puedan variar de forma independiente.

Builder (Constructor)

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.

Chain of Responsibility (Cadena de Responsabilidad)

Evita acoplar el emisor de una petición a su receptor, al dar a mas 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 ésta sea trata por algún objeto.

Command (Orden)

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

Composite (Compuesto)

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

Decorator (Decorador)

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

Facade (Fachada)

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

Factory Method (Método de Fabricación)

Define una interfaz para crear un objeto, pero deja que sean las subclases quienes decidan que clase instanciar. Permite que una clase delegue en sus subclases la creación de objetos.

Flyweight (Peso Ligero)

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

Interpreter (Intérprete)

Dado un lenguaje, define una representación de su gramática junto con un intérprete que usa dicha representación para interpretar sentencias del lenguaje.

Iterator (Iterador)

Proporciona un modo de acceder secuencialmente a los elementos de un objeto agregado sin exponer su representación interna.

Mediator (Mediador)

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 (Recuerdo)

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.

Prototype (Prototipo)

Especifica los tipos de objetos a crear por medio de una instancia prototípica, y crea nuevos objetos copiando de este prototipo.

Proxy (Apoderado)

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

Singleton (Único)

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

State (Estado)

Permite que un objeto modifique su comportamiento cada vez que cambie su estado interno. Parecerá que cambia la clase del objeto.

Template Method (Método Plantilla)

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 (Visitante)

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.