- Facade (patrón de diseño)
-
Facade (patrón de diseño)
Facade, façade o fachada es un patrón de diseño que sirve para proveer de una interfaz unificada sencilla que haga de intermediaria entre un cliente y una interfaz o grupo de interfaces más complejas.
Facade puede hacer una biblioteca de software más fácil de usar y entender, ya que facade implementa métodos convenientes para tareas comunes; hacer el código que usa la biblioteca más legible, por la misma razón; puede reducir la dependencia de código externo en los trabajos internos de una biblioteca, ya que la mayoría del código lo usa Facade, permitiendo así más flexibilidad en el desarrollo de sistemas; y puede envolver una colección mal diseñada de APIs con un solo API bien diseñado.
Contenido
Problemas que soluciona
Problema: Un cliente necesita acceder a parte de la funcionalidad de un sistema más complejo.
-
- Definir una interfaz que permita acceder solamente a esa funcionalidad.
Problema: Existen grupos de tareas muy frecuentes para las que se puede crear código más sencillo y legible.
-
- Definir funcionalidad que agrupe estas tareas en funciones o métodos sencillos y claros.
Problema: Una biblioteca es difícilmente legible.
-
- Crear un intermediario más legible.
Problema: Dependencia entre el código del cliente y la parte interna de una biblioteca.
-
- Crear un intermediario y realizar llamadas a la biblioteca sólo o, sobre todo, a través de él.
Problema: Necesidad de acceder a un conjunto de APIs, que pueden, además, tener un diseño no muy bueno.
-
- Crear una API intermedia, bien diseñada, que permita acceder a la funcionalidad de las demás.
Cuidado: Facade debe utilizarse para crear clases sencillas, no clases que "sirvan para todo" o "lo hagan todo".
Ejemplos
Java
El siguiente ejemplo esconde un calendario con un API complicada detrás de un patrón Facade más amigable. La salida es:
Date: 1980-08-20 20 days after: 1980-09-09
import java.util.Calendar; import java.util.Formatter; import java.util.GregorianCalendar; /** "Façade" */ class UserfriendlyDate { GregorianCalendar gcal; public UserfriendlyDate(String isodate_ymd) { String[] a = isodate_ymd.split("-"); gcal = new GregorianCalendar(Integer.valueOf(a[0]).intValue(), Integer.valueOf(a[1]).intValue()-1 /* !!! */, Integer.valueOf(a[2]).intValue()); } public void addDays(int days) { gcal.add(Calendar.DAY_OF_MONTH, days); } public String toString() { return new Formatter().format("%1$tY-%1$tm-%1$td", gcal).toString();} } /** "Client" */ class FacadePattern { public static void main(String[] args) { UserfriendlyDate d = new UserfriendlyDate("1980-08-20"); System.out.println("Date: "+d); d.addDays(20); System.out.println("20 days after: "+d); } }
Ejemplos de utilización
En Java las clases java.awt.Graphics y java.awt.Font.
Categoría: Patrones de diseño -
Wikimedia foundation. 2010.