ファクトリパターンを使用して、インスタンス化されたクラスがMultipleChoice、TrueFalseQuestionなどのようなQuestionTypeFactoryを作成しようとしています。
ファクトリコードは次のようになります
class QuestionFactory {
public enum QuestionType {
TrueFalse,
MultipleChoice,
Essay
}
public static Question createQuestion(QuestionType quesType) {
switch (quesType) {
case TrueFalse:
return new TrueFalseQuestion();
case MultipleChoice:
return new MultipleChoiceQuestion();
case Essay:
return new EssayQuestion();
}
throw new IllegalArgumentException("Not recognized.");
}
}
これは今のところ問題なく動作します。別の質問タイプを追加したい場合は、ファクトリクラスを変更する必要がありますが、変更したくありません。
新しい質問タイプを追加するときにファクトリのコードを変更する必要がないように、各質問クラスがファクトリに登録されるように設定するにはどうすればよいですか?私はJavaに少し慣れていないので、これを行う方法がわかりません。
編集
追加情報
すべての質問クラスはIQuestionインターフェースを実装しています。私は次のようなメソッドを実装する方法を探しています
public static void registerType(QuestionType quesType, Class<IQuestion> ques)
これにより、クラスの静的ブロックからこのメソッドを呼び出すことができるため、新しい質問タイプを追加するときに、質問ファクトリでコードを変更または追加する必要がなくなります。現在の実装を汎用化するために変更する必要があることはわかっています。上で書いた方法が構文的に引数の点で正しいかどうかはわかりませんが、概念的には何が欲しいかを示しています。