Quiero evitar el uso de clases etiquetadas y grandes bloques if-else o cambio de declaración y uso el polimorfismo con una jerarquía de clases en su lugar, que creo que es una mejor práctica.creando objetos y polimorfismo
Por ejemplo, algo como el siguiente, donde la elección del método ejecutado depende de un solo campo de un objeto de tipo Actor.
switch(actor.getTagField())
{
case 1: actor.act1(); break;
case 2: actor.act2(); break;
[...]
}
se convertiría en
actor.act();
y el método acto se aplicaría, en las subclases de Actor.
Sin embargo, la manera más obvia para decidir en tiempo de ejecución, que subclase crear una instancia parece muy similar a la original:
Actor newActor(int type)
{
switch(type)
{
case 1: return new Actor1();
case 2: return new Actor2();
[...]
}
}
así que parece que nada realmente se ha ganado; la lógica acaba de ser movida.
¿Cuál es la mejor manera de hacerlo? La única forma en que se me ocurre es implementar una clase de fábrica para cada subclase de Actor, pero parece bastante engorroso para un problema tan simple.
¿Estoy pensando demasiado? Simplemente parece que no tiene sentido hacer el cambio original si solo hago lo mismo en otro lugar.
Lo siento, para aclarar, quiero elegir qué subclase para instanciar en tiempo de ejecución, no en tiempo de compilación como en su ejemplo. Esto requiere un interruptor grande o bloque if-else, que quería evitar. Estoy empezando a pensar que no es necesario porque solo se necesitaría una vez en la creación. – flowsnake
Hmm ... en realidad, la fábrica tiene poco que ver con la compilación frente a la instanciación en tiempo de ejecución per se, más bien es la responsabilidad y el control de la creación de Actores. Por ejemplo, si la creación anterior de los Actores sucedió en un Evento, ¿no sería el tiempo de ejecución? –
Lo que estás haciendo es "decidir" centralizar la creación de los actores ... si quieres que los actores vengan de un lugar, en cuyo caso ... no puedes soslayar el cambio ... porque esa es una decisión de El usuario final. –