A nivel práctico resulta más sencillo implementar el Factory Method (ó Abstract 
Factory en este caso, puesto que la instanciación es dinámica en el crearModulo 
y no se está utilizando una clase de creación concreta) utilizando clases para 
el módulo concreto.

La signatura del método "crearModulo" debería ser entonces del tipo 
crearModulo(Function,Args[]), evitando el quick-and-dirty de _global[string] 
que, aunque funcione, podría dar sorpresas en el futuro --o no--. De igual 
forma no entiendo el uso del casting a la interfaz, ¿acaso es estrictamente 
necesario?

Me parece infinitamente más usable (y con más posibilidad para el control de 
errores) crear módulos de esta forma:

        import myModules.ConcreteModule;
        ModuleFactory.createModule(myModules.ConcreteModule,"");

Por otro lado, para mantener la consistencia en la creación de módulos la mejor 
fórmula es usar un Singleton en el Factory. También es prudente basar los 
módulos en una superclase abstracta.

0.02€ :)

M.
 

> -----Mensaje original-----
> De: [EMAIL PROTECTED] 
> [mailto:[EMAIL PROTECTED] En nombre de Joseba Alonso
> Enviado el: martes, 28 de febrero de 2006 11:33
> Para: [email protected]
> Asunto: RE: [ASNativos] Instanciar clases dinamicamente
> 
> Te envio un ejemplo del Factory Method que a mi me esta 
> funcionando, te debería valer. Si la generaciónn de clases es 
> más compleja hechale un vistazo al Abstract Factory, como ha 
> comentado Hari, pero el Factory Method es más facil de 
> entender para comenzar con ello.
> 
> 
> // IModulo.as
> // Interface que implementan todos los modulos interface IModulo{
>       function mostrarContenido();
> }
> 
> // Modulo1.as
> class Modulo1 implements IModulo{
>       private var contenido:String;
>       
>       function Modulo1(c:String){
>               contenido = c;
>       }
>       
>       public function mostrarContenido(){
>               trace("Modulo 1 muestra: "+contenido);
>       }
> }
> 
> // Modulo2.as
> class Modulo2 implements IModulo{
>       private var contenido:String;
>       
>       function Modulo2(c:String){
>               contenido = c;
>       }
>       
>       public function mostrarContenido(){
>               trace("Modulo 2 muestra: "+contenido);
>       }
> }
> 
> // ModulosFactory.as
> class ModulosFactory{
>       // Esto fuerza la exportacion de las clases
>       private var m1:Modulo1;
>       private var m2:Modulo2;
>       
>       // El Factory method
>       public static function
> crearModulo(tipo:String,contenido:String):IModulo{
>               var instancia:IModulo = IModulo(new
> _global[tipo](contenido));
>               return instancia;               
>       }
> }
> 
> // Codigo Cliente
> var m1:IModulo = ModulosFactory.crearModulo("Modulo1","¡Hola 
> Mundo!"); var m2:IModulo = 
> ModulosFactory.crearModulo("Modulo2","Foobar");
> m1.mostrarContenido();
> m2.mostrarContenido(); 
> 
> Un saludo,
> 
> Joseba Alonso
> www.5dms.com
> www.sidedev.net 
> 
> > -----Mensaje original-----
> > De: [EMAIL PROTECTED]
> > [mailto:[EMAIL PROTECTED] En nombre de eemece2 
> Enviado el: 
> > lunes, 27 de febrero de 2006 19:10
> > Para: [email protected]
> > Asunto: Re: [ASNativos] Instanciar clases dinamicamente
> > 
> > Hola Joseba, y Hari. Gracias,
> > 
> > Con tu codigo, Joseba, no consiguo que funcione con 
> parametros (igual 
> > hago algo mal).
> > Y lo del 'Factory Method Pattern' no lo conocia y me parece muy 
> > interesante, y me vendra bien en otra parte del proyecto, 
> cuando me lo 
> > estudie bien. Pero para lo que quería ahora, me da que no me vale, 
> > creo:
> > 
> > Lo que estoy haciendo ahora es un mini-framework que va a 
> leer de un 
> > XML la configuracion de un portal.
> > 
> > Ahora, en ese XML, pongo una definicion de 'paginas', dentro de las 
> > cuales hay instancias de 'modulos'. Y al final tambien estan las 
> > definiciones de las diferentes clases de modulos, cada uno 
> con un ID.
> > 
> > Ahora, a la hora de crear esos modulos, uso un switch con el ID de 
> > tipo de modulo para instanciar la clase del modulo 
> correspondiente. Lo 
> > que ocurre que esto está implementado en una clase 
> 'mainPortalForm', 
> > la cual es generica del framework, y de la cual cada portal debera 
> > derivar la suya propia. Y cada portal puede tener modulos propios.
> > 
> > Por eso queria dejar de usar switch con el ID del tipo de modulo, y 
> > usar una instanciación dinamica, a partir de strings 
> sacados del XML 
> > de configuracion del portal (de cada clase de modulo). Y en esa 
> > instanciacion tengo que usar los parametros del constructor de la 
> > clase modulo (que deriva de una clase base 'modulo').
> > 
> > No se si me he explicado.
> > El caso es que igual lo estoy planteando mal, y no es 
> necesario hacer 
> > una instanciación dinamica.
> > O igual deberia hacer que todos los modulos que implemente vayan 
> > 'hard-coded' en el 'mainPortalForm'. No lo tengo muy claro.
> > 
> > Esto va a correr por 'encima' de una aplicacion asp.net, 
> que es la que 
> > define el XML, y dentro de la cual se usa un sistema mas o menos 
> > dinamico de creacion de modulos a partir de ese XML (teniendo 
> > almacenado en el XML las cadenas de los modulos, que son controles 
> > asp.net, por ejem:
> > "Projects.asmx")
> > 
> > Perdon por la chapa, no pensaba liarme tanto :)
> > 
> > Gracias y un saludo,
> > Edu-eemece2
> > 
> 
> ----------------------------------
> Lista ASNativos:[email protected]
> http://www.5dms.com/listas
> ----------------------------------
> 

Responder a