I am trying to use a factory pattern to create a QuestionTypeFactory where the instantiated classes will be like MultipleChoice, TrueFalseQuestion etc.
The factory code
You can probably do that with the register method you've shown, through the Reflection API (that Class
thingy).
I am not proficient enough with Java Reflection to write a more helpful answer, but if you look for some getConstructor
method or something you'll probably get there.
To call that method you should do something like (note the .class
syntax):
QuestionFactory.registerType(QuestionType.TrueFalse, TrueFalseQuestion.class);
EDIT Ah, whatever, I have the time to investigate. Try this:
public class QuestionFactory {
static final Map> map =
new HashMap>();
public static void registerType(QuestionType quesType, Class extends Question> ques) {
map.put(quesType, ques.getConstructor());
}
public static Question createQuestion(QuestionType quesType) {
return map.get(quesType).newInstance();
}
}
I haven't compiled this, but it should work, or at least guide you in the right direction. For this to work the Question implementations must have a constructor without arguments.
Because you're using a static factory (aka, object-oriented global variables) you can make questions register themselves in their static initializer.
public class TrueFalseQuestion implements Question {
static {
QuestionFactory.registerType(QuestionType.TrueFalse, TrueFalseQuestion.class);
}
// Whatever else goes here
}