我有一个特殊的问题,我有一个通用class Command
的用于按顺序表示缓冲区中的命令。我也有它的几个子类,例如ComputeCommand
, DefineCommand
,DisplayCommand
等。每个子类的构造函数都带有一个String
参数,命令根据命令语法解析该参数,该命令语法因命令类型而异。
我希望能够做类似的事情:
String [] lines = { ... };
ArrayList<Command> commands = new ArrayList<Command>();
for(String line: lines){
commands.add(new Command(line))
}
但是,我需要更专业的类来处理每个命令。
如果我可以定义构造函数,例如:
Command(String line){
if(ComputeCommand.isValidComputeCommand(line))
return new ComputeCommand(line);
else if(DisplayCommand.isValidDisplayCommand(line))
return new DisplayCommand(line);
[ ... ]
}
这将完成我所需要的,但我们都知道构造函数不是这样工作的。
我想到的一种方法是包含一种方法
static Command getInstance(String line){ [...] }
执行该功能,但是我不确定在这种情况下这是正确的方法。
另一种可能的方法是为每个创建工厂类:
class CommandFactory(){
CommandFactory [] subFactories = {new ComputeCommandFactory(), [...]};
Command makeCommand(String line){
for(CommandFactory subFactory: subFactories)
if(subFactory.canMake(String line))
return subFactory.makeCommand(line);
}
boolean canMake(String line){
for(CommandFactory subFactory: subFactories)
if(subFactory.canMake(String line))
return true;
}
}
我认为这可能是最正确的方法,但如果有更好的方法,我不想增加额外的复杂性。
在这种情况下使用什么正确的设计模式?
编辑:我还计划进一步对一些命令进行子类化,例如ComputeCommand
可以有一个AddCommand
或一个MultiplyCommand
子类。