Java 从XML文件实例化对象的设计范例

Java 从XML文件实例化对象的设计范例,java,design-patterns,Java,Design Patterns,对于uni分配,我正在编写一个java程序,它需要将对象层次结构保存并加载到XML文件中。例如,程序创建一个包含动物子类列表的Zoo类,将其保存为XML,并在用户下次启动程序时再次加载 该文件可能看起来像 <Zoo> <Animals> <Lion> <name>Leo</name> <age>5</age> <

对于uni分配,我正在编写一个java程序,它需要将对象层次结构保存并加载到XML文件中。例如,程序创建一个包含动物子类列表的Zoo类,将其保存为XML,并在用户下次启动程序时再次加载

该文件可能看起来像

<Zoo>
    <Animals>
        <Lion>
            <name>Leo</name>
            <age>5</age>
            <roar>fearsome</roar>
        </Lion>
        <Elephant>
            <name>Dumbo</name>
            <age>10</age>
            <ears>let him fly</ears>
        </Elephant>
    </Animals>
</Zoo>

狮子座
5.
可怕的
小飞象
10
让他飞吧
我需要支持的动物亚类数量很少,数量有限(~5)。动物的每个亚类都有各自的属性(如耳朵和吼叫)。对于对象创建和文件创建的最佳设计模式是什么,我感到困惑

目前,我有一个类,
XMLCreator
,它的方法有
void createzoonement(Zoo)
void createlioneelement(Lion)
等,还有一个XMLReader类,它有
private Zoo createZoo(File)
private Lion createLionObject(Element)


如果这是您希望将来由其他人维护的代码,那么这是一种好方法吗?或者每个对象都应该有一个构造函数方法(将文件/元素作为参数)和另一个方法(返回文件/XMLElement)?哪种封装/可维护性最好?

我只会使用它,它允许将对象树(带注释的类)编组为XML,并将XML解编组为对象树。XML API还有其他对象,但JAXB与Java SE一起提供,并且运行良好。

在我看来,您需要
Builder
模式或
Factory
模式。查看维基百科了解更多详细信息。我会选择
工厂
模式,因为我更熟悉它。与其将其命名为
XMLCreator
,我还不如将其命名为
AnimalFactory

public class AnimalFactory () {
    private static final AnimalFactory instance = new AnimalFactory ();

    // I make this private so that I can be sure there is only one instance
    // of the object. This is another pattern, the `Singleton`
    private AnimalFactory () {};

    // This is how you would access the instance
    public static AnimalFactory getInstance () { return instance; }

    // This is where you create the animal instances.
    public Lion getLion () {...}
    public Elephant getElephant () {...}
}
你需要和我一起去

您必须实施startElement。。。可爱的。。。其他的也很少

您可以通过读取startElement方法中的元素来更改解析策略

我相信这应该很容易

应该读一本好书



此外,如果你继续创建像void createZooElement(Zoo)这样的方法,那么一天结束时,你将得到数百个无法管理的方法。

这里有很多不错的选择。用于xml数据绑定

需要XML模式


,需要一个映射文件。

使用,您可以序列化大多数Java对象,而无需任何映射。对象名称成为生成的XML中的元素名称,类中的字符串构成XML的元素内容。使用XStream序列化的类不需要实现可序列化接口。XStream是一种序列化工具,而不是数据绑定工具,这意味着出于好奇,它不会从XML或XML模式定义(XSD)文件执行类生成,“uni”代表什么?我觉得大部分的答案都没有解决OP的主要问题——“我不清楚对象创建和文件创建的最佳设计模式是什么”。我想只有anonymous对工厂模式的建议很接近。@Trasvi家庭作业标签不推荐使用。请参阅此问题右侧的社区公告博客