Quisiera utilizar un objeto de la clase Cube, pero necesito que el
Cube sea un singleton. ¿Alguien sabe como implementar este patrón de
diseño para este caso específico?
Encontré este hack
http://www.gskinner.com/blog/archives/2006/07/as3_singletons.html
pero no me sirve del todo, pues estoy obligado a incluir parámetros al
constructor de la clase Cube (la primera vez, donde realmente se crea
la instancia). No conseguí modificarlo satisfactoriamente para mis
propósitos. Alguien me da una mano?
Desde ya muchas gracias. Un saludo.
package SingletonCubo
{
public class SingletonCubo
{
private static var instance:Cube = null;
public function SingletonCubo()
{
throw new Error("SingletonCubo solo se puede acceder usando SingletonCubo.getInstance()");
}
public static function getInstance(material:MaterialObject3D = null, alto:Number = 100, fondo:Number = 100, alto:Number = 100, etc):Cube
{
if (!instance)
instance = new Cube(material, ancho, fondo, alto etc...);
return instance;
}
}
}
Aun asi, no me parece el mejor metodo por que no vas a estar pasando todo el rato el material y resto de parametros, yo creo que seria mucho mejor lo que te decia, meter una clase con un parametro cube, y que sea esa clase la que en el constructor da de alta el cubo como tu lo quieres, y asi siempre que llames al singleton te devuelve el mismo cubo, pero no tienes que pasar todo el rato los parametros. Y aunque los pongas con valores por defecto y una vez pases la primera vez te puedes olvidar de volverlo a hacer, se pierde el sentido del singleton, y tendria mas sentido un parametro estatico con un get o algo asi...
Ya me diras que tal... y si me explico fatal, es normal, preguntame de nuevo :D
--
Has recibido este mensaje porque estás suscrito al grupo "ESPapervision3D" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a ESPaper...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a ESPapervision...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/ESPapervision3D?hl=es.
Esto me hizo pensar bastante, jaja...
En AS3 podría ser posible instanciar mi cubo singleton recién cuando
tenga suficiente información para especializarlo, pero llegué a la
conclusión de que en este caso no es posible crear un singleton que
derive de otra clase Cube (extender la clase Cube convirtiéndola en
singleton, en otras palabras), debido a su forma de trabajar con los
parámetros.
Iré por otro camino, al final, creo que podré -y debería- evitar la
utilización del singleton, o del cubo primitivo, en este caso.
Probé el código que posteaste, lo usé como base. Lo modifiqué un poco,
pues al instanciar el Cube dandole como parametro el null, se lanza
una excepción. Lo puse como no obligatorio también, pero validando
para no entregar un materialList null al constructor del cubo, sino un
material predeterminado.
Pero van surgiendo nuevos problemas al solucionar los existentes, y
como dices, si lo entrego como un atributo del singleton (un getter)
de cierto modo pierde el sentido del singleton, no me deja del todo
satisfecho.
Disculpa por el rodeo de palabras.. jaja... :P
> El 31 de enero de 2010 22:29, David Pérez <david.p...@gmail.com> escribió:
>
>
>
> > Hola,
>
> > Quisiera utilizar un objeto de la clase Cube, pero necesito que el
> > Cube sea un singleton. ¿Alguien sabe como implementar este patrón de
> > diseño para este caso específico?
>
> > Encontré este hack
>
> >http://www.gskinner.com/blog/archives/2006/07/as3_singletons.html
>
> > pero no me sirve del todo, pues estoy obligado a incluir parámetros al
> > constructor de la clase Cube (la primera vez, donde realmente se crea
> > la instancia). No conseguí modificarlo satisfactoriamente para mis
> > propósitos. Alguien me da una mano?
>
> > Desde ya muchas gracias. Un saludo.
>
> > --
> > Has recibido este mensaje porque estás suscrito al grupo "ESPapervision3D"
> > de Grupos de Google.
> > Para publicar una entrada en este grupo, envía un correo electrónico a
> > ESPaper...@googlegroups.com.
> > Para anular tu suscripción a este grupo, envía un correo electrónico a
> > ESPapervision...@googlegroups.com<ESPapervision3D%2Bunsubscribe@ googlegroups.com>
Ya lo probé y funciona, apliqué la herencia que quería para que mi
objeto sea más flexible y pueda tratarlo como un cubo común y
corriente, y lo voy especializando no durante la creación, sino
después, a través de la modificación de sus atributos, y con métodos
no estáticos que agregué a la clase singleton. Finalmente mi cubo
singleton quedó así:
package {
import org.papervision3d.materials.WireframeMaterial;
import org.papervision3d.materials.utils.MaterialsList;
import org.papervision3d.objects.primitives.Cube;
public class SingletonCube extends Cube {
private static var INSTANCE:SingletonCube;
private static var allowInstantiation:Boolean;
public static function getInstance():SingletonCube {
if (INSTANCE == null) {
allowInstantiation = true;
INSTANCE = new SingletonCube();
allowInstantiation = false;
}
return INSTANCE;
}
public function SingletonCube():void {
if (allowInstantiation) {
super( new MaterialsList({all:new WireframeMaterial()}) );
}else{
throw new Error("Error: Instantiation failed: Use
SingletonCube.getInstance() instead of new.");
}
}
}
}
Muchas gracias, un saludo.
On 2 feb, 04:24, laHabichuela <lahabichu...@gmail.com> wrote:
> No se, si explicas un poco que quieres hacer, creo que te podremos ayudar
> mas, pero yo por lo que entiendo que quieres hacer y que a veces hago
> yo, tiraría haciendo algo así:
>
> private var _cubo:Cube;
>
> private static function get cubo():Cube
> {
> if (!cubo)
> cubo = new Cube(...parametros...);
>
> return cubo;
>
> }
>
> Con eso consigues que sea de solo lectura, que el cubo se cree la primera
> vez que lo pides(como un singleton), y al ser estatica, puedes acceder desde
> cualquier lado con nombrar la clase...
>
> Suerte!!
>
public final class SingletonCube extends Cube
pues al volver a extenderlo deja de funcionar :P