这段代码有一些非常不满意的地方:
/*
Given a command string in which the first 8 characters are the command name
padded on the right with whitespace, construct the appropriate kind of
Command object.
*/
public class CommandFactory {
public Command getCommand(String cmd) {
cmdName = cmd.subString(0,8).trim();
if(cmdName.equals("START")) {
return new StartCommand(cmd);
}
if(cmdName.equals("END")) {
return new EndCommand(cmd);
}
// ... more commands in more if blocks here
// else it's a bad command.
return new InvalidCommand(cmd);
}
}
我对多个出口点毫不后悔——结构很清楚。但我对这一系列几乎相同的 if 语句并不满意。我考虑过将字符串映射到命令:
commandMap = new HashMap();
commandMap.put("START",StartCommand.class);
// ... etc.
...然后使用反射使适当类的实例从地图中查找。然而,虽然在概念上很优雅,但这涉及到相当多的反射代码,继承此代码的人可能不会欣赏 - 尽管该成本可能会被收益所抵消。将值硬编码到 commandMap 中的所有行的气味几乎与 if 块一样糟糕。
如果工厂的构造函数可以扫描类路径以查找 Command 的子类,查询它们以获取字符串表示形式,并自动将它们添加到其曲目中,那就更好了。
那么 - 我应该如何去重构呢?
我想那里的一些框架免费给了我这种东西。假设我无法将这些东西迁移到这样的框架中。