Descargar

Patrones de Diseño de Software (ppt) (página 3)

Enviado por Pablo Turmero


Partes: 1, 2, 3
edu.red

41 Estructura Builder

edu.red

42 Builder Aplicabilidad Cuando el algoritmo para crear un objeto complejo debe ser independiente de las piezas que conforman el objeto y de cómo se ensamblan. El proceso de construcción debe permitir diferentes representaciones para el objeto que se construye.

edu.red

43 Builder Consecuencias Permite cambiar la representación interna del producto. Separa el código para la representación y para la construcción. Los clientes no necesitan conocer nada sobre la estructura interna. Diferentes “directores” pueden reutilizar un mismo “builder” Proporciona un control fino del proceso de construcción.

edu.red

44 Builder Implementación La interfaz de Builder debe ser lo suficientemente general para permitir la construcción de productos para cualquier Builder concreto. La construcción puede ser más complicada de añadir el nuevo token al producto en construcción. Los métodos de Builder no son abstractos sino vacíos. Las clases de los productos no siempre tienen una clase abstracta común.

edu.red

45 Ejemplo: Laberinto public class BuilderLaberinto { public void buildLaberinto () { }; public void buildPuerta (int r1, int r2) { }; public void buildHabitacion(int n) { }; public Laberinto getLaberinto() { }; protected BuilderLaberinto() { }; }

Las “paredes” forman parte de la representación interna

edu.red

46 public class JuegoLaberinto { public Laberinto makeLaberinto (BuilderLaberinto builder) { builder.buildLaberinto();

builder.buildHabitacion(1); builder.buildHabitacion(2); builder.buildPuerta(1,2);

return builder.getLaberinto(); } }

class BuilderLabNormal extends BuilderLaberinto { private Laberinto labActual; // se define la construcción de un laberinto con determinado tipo de // puertas y habitaciones … } Oculta la estructura interna Ejemplo: Laberinto

edu.red

class BuilderLabNormal extends BuilderLaberinto { private Laberinto labActual; public BuilderLabNormal () { labActual = null; } public void buildLaberinto () { labActual = new Laberinto(); } public Laberinto getLaberinto () { return labActual; } public void buildHabitacion (int n) { if ( ! labActual.tieneHabitacion(n) ) { Habitacion hab = new Habitacion (n); labActual.addHabitacion (hab); hab.setLado (Norte, new Pared()); hab.setLado (Sur, new Pared()); hab.setLado (Este, new Pared()); hab.setLado (Oeste, new Pared()); } } public void buildPuerta (int n1, int n2)) { Habitacion h1 = labActual.getHabitacion(n1); Habitacion h2 = labActual.getHabitacion(n2); Puerta p = new Puerta(h1,h2); h1.setLado(paredComun(h1,h2), p); h2.setLado(paredComun(h2,h1), p); } } Laberinto lab; JuegoLaberinto juego; BuilderLabNormal builder;

lab = juego.makeLaberinto(builder);

edu.red

48 Factory Method (Método Factoría) Propósito Define un interfaz para crear un objeto, pero permite a las subclases decidir la clase a instanciar: instanciación diferida a las subclases. Motivación Una clase C cliente de una clase abstracta A necesita crear instancias de subclases de A que no conoce. En un framework para aplicaciones que pueden presentar al usuario documentos de distinto tipo: clases Aplicación y Documento. Se conoce cuándo crear un documento, no se conoce de qué tipo.

edu.red

49 Motivación (Gp:) MiDocumento (Gp:) Documento (Gp:) open() (Gp:) close() (Gp:) save() (Gp:) revert() (Gp:) <> (Gp:) Aplicacion (Gp:) crearDocumento() (Gp:) nuevoDocumento() (Gp:) openDocumento() (Gp:) <> (Gp:) MiAplicacion (Gp:) crearDocumento() (Gp:) return new MiDocumento (Gp:) Documento d (Gp:) d = crearDocumento(); (Gp:) setDoc.add(d); (Gp:) d.open() (Gp:) “método factoria”

Método Factoría

edu.red

50 Estructura Método Factoría

edu.red

51 Método Factoría Aplicabilidad Una clase no puede anticipar la clase de objetos que debe crear. Una clase desea que sus subclases especifiquen los objetos que debe crear.

edu.red

52 Método Factoría Consecuencias Evita ligar un código a clases específicas de la aplicación. Puede suceder que las subclases de Creador sólo se crean con el fin de la creación de objetos. Mayor flexibilidad en la creación: subclases ofreciendo versiones extendidas de un objeto. El método factoría puede ser invocado por un cliente, no sólo por la clase Creador: jerarquías paralelas

edu.red

53 Método Factoría

edu.red

54 Método Factoría Implementación Dos posibilidades Creador es una clase abstracta con un método factoría abstracto. Creador es una clase concreta que ofrece una implementación por defecto del método factoría. El método factoría puede tener un parámetro que identifica a la clase del objeto a crear. Se evita crear subclases de Creador con: Metaclases (Smalltalk y Java) Genericidad (C++)

edu.red

55 Método Factoría y Genericidad C++ template class Creador { public: virtual Producto* crearProducto { return new elProducto; } } class MiProducto : public Producto { … }

Creador miCreador;

edu.red

56 Metaclases Una clase puede ser considerada un objeto: ¿Cuál es su clase? Metaclase Clase que describe clases, sus instancias son clases. Propiedades: lista de atributos, lista de variables de clase, lista de métodos, lista de métodos de clase. Java, Ruby y Smalltalk tienen metaclases Útil en programación avanzada, cuando se manejan entidades software, p.e. depuradores, inspectores, browsers,..

edu.red

57 Metaclases Metainformación Clases, atributos, métodos, etc., son representados por clases. Posibilidades Crear o modificar clases en tiempo de ejecución. Parametrizar métodos por clases o métodos. Consultar estructura y comportamiento de una clase. …

edu.red

58 Metaclases void metodo1 (Class c) { “crear instancia de la clase c” } void metodo2 (String c) { “obtener instancia de metaclase para clase c” “crear instancia de la clase c” } void metodo3 (Metodo m) { “invocar a m” }

Partes: 1, 2, 3
 Página anterior Volver al principio del trabajoPágina siguiente