domingo, noviembre 09, 2008

¿Qué es un Patrón de Diseño?

Contenido

¿Qué es un Patrón de Diseño?
Patrones Creacionales
Patrones Estructurales
Patrones de Comportamiento
Conclusión

¿Qué es un Patrón 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.

Patrones Creacionales

Fábrica Abstracta (Abstract Factory)
El problema a solucionar por este patrón es el de crear diferentes familias de objetos, como por ejemplo la creación de interfaces gráficas de distintos tipos (ventana, menú, botón, etc.).

Método de Fabricación (Factory Method)
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();
            }
      }

Prototipado (Prototype)
Se basa en la clonación de ejemplares copiándolos de un prototipo.

Singleton
Restringe la instanciación de una clase o valor de un tipo a un solo objeto.

      public sealed class Singleton 
      
            private static volatile Singleton instance; 
            private static object syncRoot = new Object(); 
            private Singleton() 
            
                  System.Windows.Forms.MessageBox.Show("Nuevo Singleton"); 
            
            public static Singleton GetInstance 
            
                  get 
                  
                        if (instance == null
                        
                             lock(syncRoot) 
                             
                                   if (instance == null
                                         instance = new Singleton(); 
                             
                        
                        return instance; 
                  
            }
       }

MVC (Model View Controler)
Este patrón plantea la separación del problema en tres capas: la capa model, que representa la realidad; la capa controler, que conoce los métodos y atributos del modelo, recibe y realiza lo que el usuario quiere hacer; y la capa vista, que muestra un aspecto del modelo y es utilizada por la capa anterior para interaccionar con el usuario.

Patrones Estructurales

  • Adaptador (Adapter): Convierte una interfaz en otra.
  • Puente (Bridge): Desacopla una abstracción de su implementación permitiendo modificarlas independientemente.
  • Objeto Compuesto (Composite): Utilizado para construir objetos complejos a partir de otros más simples, utilizando para ello la composición recursiva y una estructura de árbol.
  • Envoltorio (Decorator): Permite añadir dinámicamente funcionalidad a una clase existente, evitando heredar sucesivas clases para incorporar la nueva funcionalidad.
  • Fachada (Facade): Permite simplificar la interfaz para un subsistema.
  • Peso Ligero (Flyweight): Elimina la redundancia o la reduce cuando tenemos gran cantidad de objetos con información idéntica.
  • Apoderado (Proxy): Un objeto se aproxima a otro.

Patrones de Comportamiento

  • Cadena de responsabilidad (Chain of responsibility): La base es permitir que más de un objeto tenga la posibilidad de atender una petición.
  • Orden (Command): Encapsula una petición como un objeto dando la posibilidad de “deshacer” la petición.
  • Intérprete (Interpreter): Intérprete de lenguaje para una gramática simple y sencilla.
  • Iterador (Iterator): Define una interfaz que declara los métodos necesarios para acceder secuencialmente a una colección de objetos sin exponer su estructura interna.
  • Mediador (Mediator): Coordina las relaciones entre sus asociados. Permite la interacción de varios objetos, sin generar acoples fuertes en esas relaciones.
  • Recuerdo (Memento): Almacena el estado de un objeto y lo restaura posteriormente.
  • Observador (Observer): Notificaciones de cambios de estado de un objeto.

Public Class Articulo 
   Delegate Sub DelegadoCambiaPrecio(ByVal unPrecio As Object
   Public Event CambiaPrecio As DelegadoCambiaPrecio 
   Dim _cambiaPrecio As Object 
   Public WriteOnly Property Precio() 
      Set(ByVal value As Object
         _cambiaPrecio = value 
         RaiseEvent CambiaPrecio(_cambiaPrecio) 
      End Set 
   End Property 
End Class 
Public Class ArticuloObservador 
   Public Sub Notify(ByVal unObjecto As Object
      Console.WriteLine("El nuevo precio es:" & unObjecto) 
   End Sub 

End Class

  • Estado (Server): Se utiliza cuando el comportamiento de un objeto cambia dependiendo del estado del mismo.
  • Estrategia (Strategy): Utilizado para manejar la selección de un algoritmo.
  • Método plantilla (Template Method): Algoritmo con varios pasos suministrados por una clase derivada.
  • Visitante (Visitor): Operaciones aplicadas a elementos de una estructura de objetos heterogénea.

Conclusión

Como verán, si es que este artículo logró ilustrar sobre las distintas categorías y tipos de patrones de diseño, no debemos “reinventar la rueda” en varias de nuestras aplicaciones. Hay mucho trabajo ya realizado, testeado y aceptado que en un entorno similar a mi problema ya aporta una solución satisfactoria. ¿Para qué voy a inventar un ladrillo si ya otro lo hizo y el mismo ya fue usado en la edificación de millones de estructuras con éxito?

Quienes deseen ampliar su conocimiento respecto a este tema pueden consultar la bibliografía adjunta. Además, les comento que Microsoft no es ajeno a todo este movimiento; más aún, es conciente de la importancia del mismo y tiene sus comentarios e ideas al respecto. El tema se reduce a una cuestión de enfoque; en el siguiente diagrama puede verse cómo presenta Microsoft su concepción de patrones de diseño (Ver Figura 1):





Figura 1: Marco de Patrones según Microsoft. Volver al texto.


En el diagrama de la Figura 1, Microsoft sostiene que las columnas de la tabla son enfoques o puntos de vista de la solución, mientras que las filas representan los niveles de abstracción. Un ejemplo muy conocido en el ambiente de desarrollo Web es el patrón de diseño de capas (layers), el cual plantea la separación de una aplicación en una capa de presentación, una de negocio y una de datos.

En un futuro artículo abordaremos un interesante concepto o paradigma, el de los ANTI- Patrones, acerca del cual tomé conocimiento durante mi investigación sobre Patrones de Diseño.

Bibliografía

No hay comentarios.: