public class JuegoLaberinto { public Laberinto makeLaberinto () { Laberinto unLab = new Laberinto(); Habitacion h1 = new Habitacion(1); Habitacion h2 = new Habitacion(2); Puerta unaPuerta = new Puerta(1,2)
unLab .addHabitacion (h1); unLab .addHabitacion (h2);
h1.setLado(Norte, new Pared() ); h1.setLado(Sur, new Pared() ); h1.setLado(Este, new Pared() ); h1.setLado(Oeste,unaPuerta);
h2.setLado(Norte, new Pared); … return unLab;} }
3 Ejemplo: Laberinto Poco flexible ¿Cómo crear laberintos con otros tipos de elementos como habitacionesEncantadas o puertasQueEscuchan?
Patrones de creación permiten eliminar referencias explícitas a clases concretas desde el código que necesita crear instancias de esas clases.
4 Abstract Factory (Factoría Abstracta) Propósito Proporcionar una interfaz para crear familias de objetos relacionados o dependientes sin especificar la clase concreta Motivación Un toolkit interfaz de usuario que soporta diferentes formatos: Windows, Motif, X-Windows,..
5 Factoría Abstracta Aplicabilidad Un sistema debería ser independiente de cómo sus productos son creados, compuestos y representados Un sistema debería ser configurado para una familia de productos. Una familia de objetos “productos” relacionados es diseñada para ser utilizado juntos y se necesita forzar la restricción.
6 Factoría Abstracta Consecuencias Aísla a los clientes de las clases concretas de implementación. Facilita el intercambio de familias de productos. Favorece la consistencia entre productos Es difícil soportar nuevos productos.
7 Factoría Abstracta Implementación Factorías como singleton. Se necesita una subclase de AbstractFactory por cada familia de productos que redefine un conjunto de métodos factoría. Posibilidad de usar el patrón Prototype. Definir factorías extensibles: AbstractFactory sólo necesita un método de creación.
8 Ejemplo 1: Laberinto public class FactoriaLaberinto { public Laberinto makeLaberinto { return new Laberinto();} public Pared makePared {return new Pared();}; public Habitacion makeHabitacion(int n) { return new Habitacion(n); }; public Puerta makePuerta (Habitacion h1, Habitacion h2) {return new Puerta(h1,h2);} }
9 public class JuegoLaberinto { public Laberinto makeLaberinto (FactoriaLaberinto factoria) { Laberinto unLab = factoria.makeLaberinto(); Habitacion h1 = factoria.makeHabitacion(1); Habitacion h2 = factoria.makeHabitacion(2); Puerta unaPuerta = factoria.makePuerta(h1,h2); unLab.addHabitacion(h1); unLab.addHabitacion(h2); h1.setLado(Norte, factoria.makePared() ); h1.setLado(Este, unaPuerta) … h2.setLado(Oeste, unaPuerta); h2.setLado(Sur, factoria.makePared() ) return unLab; } } Ejemplo 1: Laberinto
10 Builder (Constructor) Propósito Separa la construcción de un objeto complejo de su representación, así que el mismo proceso de construcción puede crear diferentes representaciones. Motivación Un traductor de documentos RTF a otros formatos. ¿Es posible añadir una nueva conversión sin modificar el traductor?
Página siguiente |