【发布时间】:2020-12-27 23:58:46
【问题描述】:
我正在编写一个程序,该程序需要从文件中保存和加载各种对象。这些文件保存为 XML,因此我决定为所有可以转换为 XML 的类创建一个名为“XMLConvertible”的接口。然而,当我读取文件时,我需要根据 XML 文件的内容创建不同类型的对象。
例如:
<Component></Component>
<Module></Module>
需要先创建一个Component类型的对象,然后再创建一个Module类型的对象。
到目前为止,我遇到的最简洁的方法是拥有一个工厂,其中包含可以从 XML 文件中读取的所有不同类的静态生成器列表。像这样(为简洁起见,省略了一些信息):
public interface XMLConvertible {
public void write();
public void read();
}
public abstract class Factory {
private static Map<String, Builder> xmlConvertibles = new HashMap<>();
public static void addXmlConvertible(String key, XMLConvertible value) {
xmlConvertibles.put(key, value);
}
public static XMLConvertible getXmlConvertible(String key) {
return xmlConvertibles.get(key);
}
}
public class Component implements XMLConvertible {
...
}
public class ComponentBuilder extends Builder {
static {
Factory.addXmlConvertible("Component", new ComponentBuilder);
}
public Component build() {...}
}
public class Module implements XMLConvertible {
...
}
public class ModuleBuilder extends Builder {
static {
Factory.addXmlConvertible("Component", new ComponentBuilder);
}
public Module build() {...}
}
问题在于我必须为我添加的每个新 XMLConvertible 类创建 2 个类,一个实际类和一个构建器。我想有一种方法强迫自己添加一个构建器,这样我就不会忘记,或者最好找到一种更干净的方法来实现这样的东西。
抱歉,这篇文章太长了,我试着把它缩短一点。希望它仍然很容易理解问题所在。
【问题讨论】:
-
这是个老问题了,被问过很多次了。但我现在找不到规范的答案。
-
您正在实施序列化。看看this
-
如果我错了,请纠正我,但据我所知,在阅读 XML 时,我仍然需要知道我正在反序列化的类。那么我不会遇到同样的问题吗?
标签: java inheritance design-patterns io