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

Por Nicolás Tedeschi

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):

Bb972240.art233-img01-400x196(es-es,MSDN.10).gif
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

Bb972240.nicolas_tedeschi(es-es,MSDN.10).gif Nicolás Tedeschi es Analista de Sistemas de la Facultad de Ingeniería del Uruguay y se encuentra desarrollando tecnología .net y SQL Server. Desde1995 trabaja con tecnologías Microsoft de tres capas (HTML-ASP, COM+ y SQL Server). Es además Desarrollador 5 Estrellas de Microsoft MSDN y ha obtenido 3 Estrellas de ese programa.