Transcript
Page 1: Dsii - Clase19 - Gof

DESARROLLO DE SOFTWARE II

Escuela de Ingeniería y Sistemas de Computación

ING. PAVEL FRANCO MARÍ[email protected]

[email protected]

[email protected]

Agosto – Diciembre 2009

Page 2: Dsii - Clase19 - Gof

Universidad del Valle

Patrones de diseño

Page 3: Dsii - Clase19 - Gof

• Introducción

• Factoria

• Singleton

• Fachada

• Adaptador

• Compuesto

Patrones de diseño

Universidad del Valle

Page 4: Dsii - Clase19 - Gof

Universidad del Valle

Introducción

Page 5: Dsii - Clase19 - Gof

Propuestos por Gamma, Helm, Johnson, Vlissides.

• Factoría

• Singleton

• Fachada

• Adaptador

• Compuesto

Introducción

Universidad del Valle

5

Page 6: Dsii - Clase19 - Gof

Universidad del Valle

Factoría

Page 7: Dsii - Clase19 - Gof

Este tipo de patrón es muy usado debido a su

utilidad, pues su objetivo es devolver una instancia

de múltiples tipos de objetos. Normalmente, todos

estos objetos provienen de una misma clase padre,

diferenciándose entre ellos por algún aspecto de

comportamiento.

Factoría

Universidad del Valle

7

Page 8: Dsii - Clase19 - Gof

Factoría

Universidad del Valle

8

Page 9: Dsii - Clase19 - Gof

Problema

¿Quién debe ser el responsable de la creación de

objetos en una familia de clases?

Solución

Crear una clase derivada que toma la decisión

sobre qué clase instanciar y cómo instanciarla.

Factoría

Universidad del Valle

9

Page 10: Dsii - Clase19 - Gof

La clase factoría devuelve una instancia de una objeto

según los datos que se le pasan como parámetros.

Para que la creación centralizada de objetos sea lo

“útil y eficaz” posible, todos los objetos creados

descienden de la misma clase o implementan la misma

interface, así podemos usarlos todos de la misma

manera, con los mismo métodos (gracias al

polimorfismo), sin importar que clase concreta estamos

tratando en cada momento.

Factoría

Universidad del Valle

10

Page 11: Dsii - Clase19 - Gof

Estructura:

Product. Una clase en este rol es superclase abstracta de objetos producidospor el patrón Método de Fábrica.

ConcreteProduct. Cualquier claseconcreta instanciada por los objetosque participan en este patrón.

CreationRequestor. El objeto querequiere la creación, es una claseindependiente de la aplicación quenecesita crear clases especificas de laaplicación. Esto lo hace indirectamentea través de una instancia de la claseFactory.

Factoría

Universidad del Valle

11

Page 12: Dsii - Clase19 - Gof

FactoriIF. Es una interfazindependiente de la aplicación. Losobjetos que crean productosusando CreationRequestor debenimplementar esta interfaz. Lasinterfaces de este tipo declaran unmétodo que es llamado por unobjeto CreationRequestor paracrear productos concretos.

Factory. Es una clase especifica dela aplicación que implementa lainterfaz de fabrica adecuada ytiene un método para crearproductos concretos.

Factoría

Universidad del Valle

12

Page 13: Dsii - Clase19 - Gof

Implementación

El patrón permite que la función de creación “cree”

múltiples instancias de Product. El objeto Factory

será el encargado de decidir según los parámetros

que le pasemos, el tipo de objeto que nos

devolverá.

Factoría

Universidad del Valle

13

Page 14: Dsii - Clase19 - Gof

public class Vehiculo{

}

public class Camion extends Vehiculo{

}

public class Coche extends Vehiculo{

}

Factoría

Universidad del Valle

14

Page 15: Dsii - Clase19 - Gof

public class VehiculoFactory{

public static CAMION = 0;

public static COCHE = 1;

public Vehiculo getVehiculo(inttipo){

if(tipo == VehiculoFactory.CAMION){

return new CAMION();

}

else{

return new COCHE();

}

}

}

Factoría

Universidad del Valle

15

Page 16: Dsii - Clase19 - Gof

Aplicación

• Cuando una clase no puede anticipar el tipo deobjetos que debe crear.

• Una clase quiere que sean sus subclases quienesespecifiquen los objetos que ésta crea.

• Queremos centralizar el proceso de creación deinstancias.

• Crear objetos dentro de una clase con un método defabricación es siempre más flexible que hacerlodirectamente.

Factoría

Universidad del Valle

16

Page 17: Dsii - Clase19 - Gof

Universidad del Valle

Singleton

Page 18: Dsii - Clase19 - Gof

• Diseñado para restringir la creación de objetos

pertenecientes a una clase o el valor de un tipo a

un único objeto.

• Su intención consiste en garantizar que una clase

sólo tenga una instancia y proporcionar un punto de

acceso global a ella.

Singleton

Universidad del Valle

18

Page 19: Dsii - Clase19 - Gof

• Se implementa creando en nuestra clase un

método que crea una instancia del objeto sólo si

todavía no existe alguna. Para asegurar que la

clase no puede ser instanciada nuevamente se

regula el alcance del constructor (con atributos

como protegido o privado).

Singleton

Universidad del Valle

19

Page 20: Dsii - Clase19 - Gof

• Las situaciones más habituales de la aplicación de

éste patrón son aquellas en las que dicha clase

controla el acceso a un recurso físico único (como

puede ser el mouse o un archivo abierto en modo

exclusivo) o cuando cierto tipo de datos debe estar

disponible para todos los demás objetos de la

aplicación.

Singleton

Universidad del Valle

20

Page 21: Dsii - Clase19 - Gof

El patrón Singleton provee una única instancia

gracias a que:

• La propia clase es responsable de crear la única

instancia.

• Permite el acceso global a dicha instancia

mediante un método de clase.

• Declara el constructor de clase como privado para

que no sea instanciable directamente.

Singleton

Universidad del Valle

21

Page 22: Dsii - Clase19 - Gof

Intención

Garantizar que una clase sólo tenga una instancia

y proporcione un punto de acceso global a ella.

Problema

Varios clientes distintos precisan referenciar a un

mismo elemento y queremos asegurarnos de que no

hay más de una instancia de ese elemento.

Singleton

Universidad del Valle

22

Page 23: Dsii - Clase19 - Gof

Solución

Garantizar una única instancia

Singleton

Universidad del Valle

23

Page 24: Dsii - Clase19 - Gof

Implementación

• Cambio el constructor a privado.

• Hago que la clase no pueda ser heredada.

• Agrego una variable estática del mismo tipo de laclase donde esta contenida (instancia).

• Agrego un método estático que retorne la variableestática (getInstance).

• No creo el objeto hasta que sea necesario.

• Agrego el código necesario para no crear dosinstancias en distintos hilos.

Singleton

Universidad del Valle

24

Page 25: Dsii - Clase19 - Gof

Implementación

Singleton

Universidad del Valle

25

Page 26: Dsii - Clase19 - Gof

Usos conocidos

Quien haya utilizado Microsoft Word, sabe que alpresionar la techa Ctrl+B se obtiene el cuadro dediálogo de búsqueda. Sin embargo, durante toda lavida de la aplicación, solo puede haber un cuadro dediálogo de búsqueda al mismo tiempo. Aún si tenemosabiertos varios documentos, solo puede existir unainstancia que trabaja en cualquier documento activo. Dehecho, necesitamos más que una instancia del cuadro dediálogo de búsqueda.

Singleton

Universidad del Valle

26

Page 27: Dsii - Clase19 - Gof

Usos conocidos

Un programa de mensajería instantánea

(Messenger), el cual debe permitir que el usuario

de una cuenta establezca sesión solo una vez al

tiempo. En esta aplicación, el patrón Singleton nos

ayuda a que la conexión del usuario sea única, a la

vez que “impide” el establecimiento de sesiones

multiusuario.

Singleton

Universidad del Valle

27

Page 28: Dsii - Clase19 - Gof

Universidad del Valle

Fachada

Page 29: Dsii - Clase19 - Gof

• El patrón Fachada proporciona una interfaz

unificada de alto nivel para un subsistema, que

oculta las interfaces de bajo nivel de las que lo

impiden.

• Con esto se consigue dos objetivos fundamentales:

hacer el subsistema más fácil de usar y desacoplar

a los clientes de las clases del subsistema.

Fachada

Universidad del Valle

29

Page 30: Dsii - Clase19 - Gof

• Cuando un cliente que trata utilizar los serviciosofrecidos por un subsistema actuando directamentesobre las interfaces de las clases que implementendicho subsistema se está exponiendo los siguientesinconvenientes:

• Debe contener el conocimiento de cómo funcionan esas clases, comprenderperfectamente la semántica de sus complejas interfaces de bajo nivel y sabercomo utilizarlas. En cada uno de los clientes debe estar codificada lasecuencia de mensajes que pondrá a las clases del subsistema encolaboración para obtener el servicio deseado.

• Debe mantenerse informado de los cambios en dichas interfaces o en ladistribución de responsabilidades entre las clases de bajo nivel y actualizarsu código adecuadamente.

Fachada

Universidad del Valle

30

Page 31: Dsii - Clase19 - Gof

Aplicaciones

Por todo esto se deberá aplicar el patrón fachada cuando se dealguna de las siguientes circunstancias:

• En general cuando por algún motivo se desee dotar de unainterfaz sencilla y usable a un subsistema complejo. Una fachadaproporciona una vista por defecto de la funcionalidad delsubsistema suficiente para la mayoría de los programadores.

• Cuando se quiera estructurar un sistema de subsistemassiguiendo un patrón de capas. Será de gran ayuda dotar de unafachada a cada nivel de subsistemas y utilizarla como punto deacceso al mismo. De este modo se simplificará al máximo elmantenimiento de las dependencias entre niveles.

Fachada

Universidad del Valle

31

Page 32: Dsii - Clase19 - Gof

Estructura

Fachada

Universidad del Valle

32

Page 33: Dsii - Clase19 - Gof

Estructura

Fachada

Universidad del Valle

33

Page 34: Dsii - Clase19 - Gof

Ventajas

• Ayuda a organizar un sistema en capas, ayuda a

controlar o eliminar las dependencias complejas o

circulares entre objetos y permite hacer cambios en los

componentes de un subsistema sin afectar a los clientes.

• En general facilita enormemente el desarrollo

independiente de clientes y subsistemas. Además tiene

un gran impacto sobre la reusabilidad de los

subsistemas.

Fachada

Universidad del Valle

34

Page 35: Dsii - Clase19 - Gof

Universidad del Valle

Adaptador

Page 36: Dsii - Clase19 - Gof

Una clase Adaptador implementa una interfaz conocidapara sus clientes y provee acceso a una instancia deuna clase no conocida. Un objeto Adaptador provee lafuncionalidad prometida por una interfaz, sin tener queasumir qué clase es usada para implementar lainterfaz.

Es usada para crear interfaces entre clases.

Este patrón adapta la interfaz de una clase a lainterfaz esperada por sus clientes. Favorece lareutilización (de la clase adaptada) y permite lacolaboración de clases con interfaces incompatibles.

Adaptador

Universidad del Valle

36

Page 37: Dsii - Clase19 - Gof

Diagrama general

Client. Clase que llama aun método de otra clase através de una interfaz, sinasumir que el objeto queimplementa el método alque llama, pertenezca auna clase especifica.

TagetIf. Esta interfazdeclara el método queuna clase Client llama.

Adaptador

Universidad del Valle

37

Page 38: Dsii - Clase19 - Gof

Adapter. Esta claseimplementa la interfaz.Implementa el método queel cliente llama, haciendo unllamado a un método de laclase Adapatee, la noimplementa la interfaz.

Adaptee. Esta clase noimplementa el método deinterfaz, pero tiene algúnmétodo que la clase clientequiere llamar.

Adaptador

Universidad del Valle

38

Page 39: Dsii - Clase19 - Gof

Ejemplo

Adaptador

Universidad del Valle

39

Page 40: Dsii - Clase19 - Gof

Aplicaciones

• Se desea utilizar una clase ya existente pero cuya

interfaz no coincide con la que necesita.

• Se desea crear una clase que colabora con otras

clases que no tienen interfaces compatibles.

• Se desea adaptar varias subclases ya existentes

adaptando la interfaz de su clase padre común

(object adapter).

Adaptador

Universidad del Valle

40

Page 41: Dsii - Clase19 - Gof

Universidad del Valle

Compuesto

Page 42: Dsii - Clase19 - Gof

• El patrón Composite permite construir objetoscomplejos componiendo de forma recursiva objetossimilares en una estructura de árbol.

• Permite manipular todos los objetos contenidos en elárbol de una forma uniforme, ya que todos ellosposeen una interfaz común definida en la clase raíz.

• Para representar jerarquías de objetos.

• Para que los clientes puedan ignorar la diferenciaentre los objetos compuestos y los objetos de laestructura de forma uniforme.

Compuesto

Universidad del Valle

42

Page 43: Dsii - Clase19 - Gof

Estructura

Component. Clase abstractade la que heredan todas lasdemás. Declara la interfaz detodos los objetos de lacomposición. Declara unainterfaz de acceso ymanipulación de loscomponentes hijo.Opcionalmente, define unainterfaz para acceder alpadre de cada componente.

Compuesto

Universidad del Valle

43

Page 44: Dsii - Clase19 - Gof

Composite. Súper clase quedefine los métodos necesariospara manejar los objetos queagrupa un nodo compuesto.Define el comportamiento delos componentes compuestos.Almacena los hijos. Implementalas operaciones de manejo delos componentes hijos. Losobjetos compuestosnormalmente tratan a losobjetos que contienen comoinstancias de componente.

Compuesto

Universidad del Valle

44

Page 45: Dsii - Clase19 - Gof

Leaf. Nodo hoja del árbolde objetos a partir de laestructura de clases. Notiene hijos. Define elcomportamiento de losobjetos primitivos delcompuesto.

Client. Maneja los objetosque forman parte delcompuesto decomponentes.

Compuesto

Universidad del Valle

45

Page 46: Dsii - Clase19 - Gof

Ejemplo

Compuesto

Universidad del Valle

46

Page 47: Dsii - Clase19 - Gof

Consecuencias

• Se define una jerarquía de objetos hoja y objetoscompuestos que se van componiendo de formarecursiva.

• El cliente se simplifica, ya que trata los objetoshoja y los objetos compuestos de la misma forma.

• La inclusión de nuevas clases hoja o clasescompuestas no modifica la estructura anterior ni elcódigo del cliente.

Compuesto

Universidad del Valle

47

Page 48: Dsii - Clase19 - Gof

Implementación

public interface Componente{

Compuesto obtenerCompuesto();

}

public class Hoja implements Componente{

public Compuesto obtenerCompuesto()

return null;

}

}

Compuesto

Universidad del Valle

48

Page 49: Dsii - Clase19 - Gof

public class Compuesto implements Componente{

private Nombre nombre;

private Vector lista;

public Compuesto (String nombre){

nombre = new Nombre(nombre);

lista = new Vector();

}

public void add (Componente componente){

lista.addElement(componente);

}

Compuesto

Universidad del Valle

49

Page 50: Dsii - Clase19 - Gof

public boolean remove (Componente componente){

return lista.removeElement(componente);

}

public Componente obtenerHijo (int hijo){

return (Componente) lista.elementAt(hijo);

}

public Compuesto obtenerCompuesto(){

return this;

}

}

Compuesto

Universidad del Valle

50

Page 51: Dsii - Clase19 - Gof

En el paquete swing de Java encontramos:

Componente – Component

Compuesto Abstracto – Container

Compuesto Concreto – JPanel, JDrame, JDialog

Hoja – JLabel, JTextField, JButton

Compuesto

Universidad del Valle

51

Page 52: Dsii - Clase19 - Gof

GRACIAS

¿…?

Universidad del Valle


Top Related