我有一個特殊的問題,我有一個通用的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_是工廠方法。您不必爲了擁有工廠方法而引入新類。 –