【发布时间】:2010-04-06 02:35:06
【问题描述】:
我正在尝试使用工厂模式来创建 QuestionTypeFactory,其中实例化的类将类似于 MultipleChoice、TrueFalseQuestion 等。
工厂代码看起来像这样
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)
这样我就可以从我的类的静态块中调用此方法,这样当我添加新的问题类型时,我就不必在问题工厂中更改或添加任何代码。我知道我必须更改当前的实现以使其通用。我不确定我上面写的方法在语法上是否正确,但它显示了我想要的概念。
【问题讨论】:
-
我认为你的意思是“增强”工厂模式
-
我想到了两个很好的解决方案,但是 Java 缺乏 Real Life-Sized Generics™ 和闭包使它们一文不值:(。我认为你被手工劳动或一些代码模板魔法所困扰,或反射。
-
@TP: 第二个参数应该是
Class<IQuestion>吧?你想说的是要创建的类,而不是它的实例(因为,如果你已经有一个实例,你就不需要工厂)。 -
@ Martinho Fernandes 这可能是我需要的参数。我是 java 新手,所以我不知道实现这类事情的确切语法
-
... 这是 XML、注释和反射的例子 grin
标签: java design-patterns factory-pattern