Está en la página 1de 4

Prctica #6

Factory Method + C arg a d in m ica d e clas e s


6 .1 . O b jetiv os

El objetivo de esta prctica es profundizar en los conceptos vistos en teora sobre el P D F actory M eth od . P ara ello es aconsejable q ue h ay a asistido a las clases previas de teora y h ay a repasado los apuntes de las m ism as. V am os a utilizar la posibilidad q ue nos ofrece Java de carg ar dinm icam ente clases para q ue nuestro fram ew ork sea ex tensible m ediante el uso de plug ins.

6 .2 .

Motiv aci n

L a A P I de re ex i n de Java es una h erram ienta m uy poderosa q ue perm ite entre otras m uch as cosas la carg a dinm ica de clases. Junto con el P D F actory M eth od nos perm ite m odi car o a adir nuevas funcionalidades a una aplicaci n y a ex istente. A m odo de ejem plo, el entorno de desarrollo Eclipse lleva esta idea a su m x im o g rado y basa su arq uitectura en plug ins, perm itiendo q ue los usuarios ag reg en nuevas funcionalidades y personalizen el entorno de desarrollo. En g eneral, para llevar a cabo lo anterior, necesitam os una interfaz q ue de na c m o se debe llam ar al c dig o ex terno y una clase q ue nos proporcione objetos concretos q ue im plem entan la interfaz. C ada uno de esos objetos concretos recibe el nom bre de plug in y podran ser desarrollados por terceras

34

Prctica #6. Factory Method + C arg a d in m ica d e clas e s

partes. Por ltimo, se delega la responsabilidad de cargarlos en tiempo de ejecucin a una fbrica.

6.3.

java.lang.Class

T odos los objetos en java heredan de la clase Object y poseen el m todo public nal Class getClass(). Este m todo devuelve un objeto Class, que nos abre las puertas a la API de reexin de Java, ofreci ndonos la posibilidad de introspeccin. De todas las posibilidades que ofrece esta API, estamos interesados en la construccin de nuevas instancias de clases. En este sentido, el m todo esttico Class forName(String className) carga una clase del classpath a partir de su nombre (nombre completo, con todos los paquetes). S i la clase no se puede cargar, porque no se encuentra en el classpath, se lanzar una excepcin ClassNotFoundException. Por ejemplo: try { Class c = Class.forName(xxx.yyy.zzz.OneClassName); ... } catch (ClassNotFoundException e) { e.printStackTrace(); throw new RuntimeException("Couldnt load the class"); } U na vez que tenemos la clase podemos crear una nueva instancia. Para ello usamos el m todo newInstance() asociado a un objeto de tipo Class, que puede lanzar las excepciones IllegalAccessException y InstantiationException. Por ejemplo: try { Object cInstance = c.newInstance(); ... } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("Couldnt create the instance"); }

6.4 .

D esarrollo de la p r ctica

La gura 6 .1 muestra el nuevo diagrama de clases de nuestro proyecto. Los cambios que se han realizado son los siguientes:

6.5. Cuestiones Se han movido las polticas de rechazo al paquete isw2.login.

35

La clase LoginFrm pasa a llamarse StandardLoginFrm y es la pantalla de login por defecto del framework. Se ha aadido la clase abstracta LoginFrm que ser extendida por todos los plugins (ventanas de login). Se ha aadido la fbrica LoginFrmFactory para la carga de los plugins. Se ha aadido la clase UserLoginFrm en el paquete isw2.application a modo de ejemplo de plugin. Se pide lo siguiente: 1. R efactorize el cdigo con objeto de introducir la clase abstracta LoginFrm que contiene el comportamiento comn a todas las ventanas de login. 2 . Utilize la API de reexin de Java con el PD Dynamic Factory para permitir que el usuario del framework pueda personalizar la ventana de login. Para ello cree la fbrica LoginFrmFactory como un singleton que lee de un chero de propiedades la ventana de login a cargar.

6.5.

Cuestiones

CU E S T I N 6.21: Tiene sentido implementar la nueva fbrica como un Singleton ? CU E S T I N 6.22: Q ue ventajas ofrece aadir la interface ILoginFrm?

36

Prctica #6. Factory Method + Carga dinmica de clases

isw2.login adapters HotMailAdapter LocalAdapter LDAPAdapter authmethods HotMailProxy LocalProxy uses LDAPProxy RefusePolicyFactory <<Interface>> IPasswordChecker +Bool authenticate(String,String) +String provider() +IRefusePolicy create(int) creates <<singleton>> Login <<Interface>> IRefusePolicy +fault(int) <<Interface>> IResource +run() refusepolicies StrictPolicy WaitPolicy utils JDBCUtil

HardCodedChecker

LoginFrm #doLogin() #doExit() #String getPassword() #String getUsername() creates <<singleton>> LoginFrmFactory +LoginFrm create() uses isw2.application UserLoginFrm ApplicationFrm uses FileTracer ConsoleTracer TracerFactory isw2.tracer creates

HardCodedLoginFrm StandardLoginFrm

WarningPolicy

NaivePolicy

<<Interface>> ITracer

TracerDecorator

HALTracer

DateTracer

Figura 6.1: D iagrama de clases de nuestro p roy ecto.

También podría gustarte