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 looks something like this
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.");
}
}
This works ok for now. If I want to add another question type I will need to modify the factory class and I do not want to do that.
How can I set it up so that each question class registers itself with the Factory so that when I add a new question type, I do not have to change the code for the factory? I am a bit new to java and am not sure how to do this.
Edit
Additional Information
All the question classes implement an IQuestion interface. I am looking for a way to implement a method like
public static void registerType(QuestionType quesType, Class<IQuestion> ques)
so that I can call this method from a static block from my classes so that when I add a new question type, I will not have to change or add any code in the Question Factory. I know I would have to change the current implementation to make it generic. I am not sure the method that I wrote above is correct in terms of its arguments syntactically or not but it shows what I want in concept.
You can probably do that with the register method you’ve shown, through the Reflection API (that
Classthingy).I am not proficient enough with Java Reflection to write a more helpful answer, but if you look for some
getConstructormethod or something you’ll probably get there.To call that method you should do something like (note the
.classsyntax):EDIT Ah, whatever, I have the time to investigate. Try this:
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.