augment the factory pattern in java

前端 未结 3 845
Happy的楠姐
Happy的楠姐 2021-02-04 19:48

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

3条回答
  •  一整个雨季
    2021-02-04 20:09

    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 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
    }
    

提交回复
热议问题