使用工厂,解决方案如下所示:
interface FighterFactory {
Fighter create();
}
保留Map< String,FighterFactory>外观中的变量.每种战斗机类型都必须在此地图中与其工厂一起注册.
private Map fighters;
public void register(String name, FighterFactory factory) {
fighters.put(name, factory);
}
在每种Fighter类型中都嵌入一个内部类Factory例如
class Foo extends Fighter {
//code for Foo
public static class Factory implements FighterFactory {
public Foo create() {
return new Foo();
}
}
}
// and in your Facade
register("Foo", new Foo.Factory());
要实例化新的Fighter,请进入Fighter-Map并对其结果执行create.
FighterFactory factory = fighters.get(nameFromClient);
// null handling, if nameFromClient is not a Fighter type;
return factory.create();
与反射相比,此设计具有一些优点:
>它是安全的
> create方法可以做的不仅仅是构造函数
以及单一工厂方法(一种方法可处理所有Fighter类型):
>如果create方法变得比您对代码所做的更改更复杂(例如,创建实例需要更多的参数),则位于Fighter类而非工厂方法处.
和枚举方法:
>使用的Enum的唯一功能是遍历其值.保留值映射将用映射查找替换迭代
>如何构造战斗机的信息位于战斗机附近,而不是冠军枚举
>您甚至可以确定FighterFactories是顶级类,而枚举内部类Factories则无法实现.