你可以使用枚举
public enum EnemyType {
ORC{
@override
public Enemy create() {
return new Orc();
}
},
TROLL{
@override
public Enemy create() {
return new Troll();
}
}...etc;
public abstract Enemy create();
}
然后将相关的枚举传递给你的 wave 方法:
public Collection<Enemy> createWave(final int num, final EnemyType enemyType) {
final Collection<Enemy> enemies = new ArrayList<>(num);
for(int i=0;i<num;i++) {
enemies.put(enemyType.create());
}
return enemies;
}
如果您有很多不同的敌人类型,请考虑使用通用工厂
public interface EmemyFactory<E extends Enemy> {
E create();
}
然后为每个敌人类型创建一个实现并将它们存储在枚举中
public enum EnemyType {
ORC(new OrcFactory()),
TROLL(new TrollFactory()),
...etc;
private final EnemyFactory enemyFactory;
public EnemyType(final EnemyFactory enemyFactory) {
this.enemyFactory = enemyFactory;
}
public Enemy create() {
return enemyFactory.create();
}
}
最后也是至少你可以使用一点反射,假设你的 Enemies 有一个 noargs 构造函数:
public Collection<Enemy> createWave(final int num, final Class<? extends Enemy> enemyClass) {
final Collection<Enemy> enemies = new ArrayList<>(num);
for(int i=0;i<num;i++) {
enemies.put(enemyClass.newInstance());
}
return enemies;
}
这很混乱,而且很容易出现运行时错误……