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);
[ ... ]
}
それは私が必要とすることを達成するでしょうが、私たち全員が知っているように、コンストラクターはそのようには機能しません。
私が考えた1つの方法は、次のようなメソッドを含めることです
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