我即将在java中实现工厂模式。我在工厂里有一个像 HashMap 这样的地图,我会用我选择的键添加所有具体的实现。密钥由 MyAbstract 类中的抽象方法 getImplName() 定义。
我的要求是当有人扩展 MyAbstractClass 并定义 getImplName() 时,必须将键值对自动添加到工厂映射中,而不是手动执行此操作的代码。这可能吗 ?我在考虑使用自定义注释。让我知道你的建议
我即将在java中实现工厂模式。我在工厂里有一个像 HashMap 这样的地图,我会用我选择的键添加所有具体的实现。密钥由 MyAbstract 类中的抽象方法 getImplName() 定义。
我的要求是当有人扩展 MyAbstractClass 并定义 getImplName() 时,必须将键值对自动添加到工厂映射中,而不是手动执行此操作的代码。这可能吗 ?我在考虑使用自定义注释。让我知道你的建议
在您的抽象类的构造函数中,您应该能够调用 getImplName() 并将其添加到您的地图中(假设您的地图有一个已知实例,否则需要传入)。
或者,您可以在构造函数中添加参数以获取所需的值。
关于工厂元素是否应该识别工厂方法存在争议。
如果您希望您的元素识别工厂,我建议您采用以下方法:
public abstract class MyAbstractClass {
public MyAbstractClass(MyFactory factory) {
factory.addElement(getImplName(),this);
}
public abstract String getImplName();
}
public class MyTestClass extends MyAbstractClass {
public MyTestClass(MyFactory factory) {
super(factory);
}
}
其中 MyFactory 是具有 HashMap 作为内部字段的工厂
这种方式扩展 MyAbstractClass 的程序员被迫提供一个 CTOR,通过调用超类 CTOR 将类的对象添加到工厂。