我有一个特殊的问题,我有一个通用的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
子类。
只需要注意一点:'static命令getInstance(String line){[...]}'_already_是工厂方法。您不必为了拥有工厂方法而引入新类。 –