gpt4 book ai didi

java - 在java中扩充工厂模式

转载 作者:搜寻专家 更新时间:2023-11-01 01:48:13 25 4
gpt4 key购买 nike

我正在尝试使用工厂模式创建一个 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 接口(interface)。我正在寻找一种方法来实现类似

的方法
public static void registerType(QuestionType quesType, Class<IQuestion> ques)

这样我就可以从我的类的静态 block 中调用这个方法,这样当我添加一个新的问题类型时,我就不必在问题工厂中更改或添加任何代码。我知道我必须更改当前的实现以使其通用。我不确定我上面写的方法在语法上是否正确,但它显示了我想要的概念。

最佳答案

您可能可以通过反射 API(Class 东西)使用您展示的 register 方法来做到这一点。

我对 Java 反射不够熟练,无法编写更有用的答案,但如果您寻找一些 getConstructor 方法或其他方法,您可能会找到。

要调用该方法,您应该执行如下操作(注意 .class 语法):

QuestionFactory.registerType(QuestionType.TrueFalse, TrueFalseQuestion.class);

编辑 啊,不管怎样,我有时间调查一下。试试这个:

public class QuestionFactory {
static final Map<QuestionType, Constructor<? extends Question>> map =
new HashMap<QuestionType, Class<? extends Question>>();

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();
}
}

我还没有编译它,但它应该可以工作,或者至少可以指导您朝着正确的方向前进。为此,Question 实现必须具有不带参数的构造函数。

因为您使用的是静态工厂(也称为面向对象的全局变量),所以您可以让问题在其 static initializer 中自行注册。 .

public class TrueFalseQuestion implements Question {
static {
QuestionFactory.registerType(QuestionType.TrueFalse, TrueFalseQuestion.class);
}
// Whatever else goes here
}

关于java - 在java中扩充工厂模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2582357/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com