1

Command というインターフェイスがあります。

public interface Command {
// irrelevant code
}

そして、このインターフェースを実装する約 15 のクラス:

public class Comm_A implements Command {
// irrelevant code
}

public class Comm_B implements Command {...}
....
public class Comm_XZ implements Command {...}

そして、String を受け取り、対応するコマンドのインスタンスを返すファクトリ:

public class CommandFactory {
    public static Command getCommand(String s) {
        if (s.equals("Comm_A")) return new Comm_A();
        else ... // each particular case
    }
}

工場コードを変更せずに新しいコマンドを追加できるようにしたいと考えています。

「Comm_A」...「Comm_XZ」の各ケースをハードコーディングせず、java.lang.reflect を使用せずに、対応するインスタンスを自動的に試行して作成することはできますか?

4

3 に答える 3

0

これには、ある種の委任ファクトリーを使用できます。マップ内のオブジェクトへの参照を保持する代わりに (Jiri Tousek の回答のように)、さまざまなコマンドのファクトリを保持できます。

public class CommandFactory{
    private static final Map<String, Callable<Command>> commands = new HashMap<>();
    public static void registerCommand(String command, Callable<Command> factory){
        commands.put(command, factory);
    }
    public static Command getCommand(String command){
        Callable<Command> factory = commands.get(command);
        if(factory != null){
            return factory.call();
        }
        return null;
    }
}
于 2015-11-25T14:09:37.567 に答える