设计范例,用于从XML文件中实例化对象

时间:2011-08-21 10:21:19

标签: java design-patterns

对于uni赋值我正在编写一个需要保存对象层次结构并将其加载到XML文件的java程序。例如,程序创建一个Zoo类,其中包含Animals的子类列表,将其保存为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)。每个动物的子类都有各自的属性(如Ears和Roar)。我很困惑对象创建和文件创建的最佳设计模式是什么。

目前,我有一个类XMLCreator,其中包含void createZooElement(Zoo)void createLionElement(Lion)等方法,以及带有private Zoo createZoo(File)private Lion createLionObject(Element)的XMLReader类

如果这是您希望将来由其他人维护的代码,这是一个很好的方法吗?或者每个对象应该有一个构造函数方法,它将File / Element作为参数,另一个方法返回File / XMLElement?哪种封装/可维护性最强?

5 个答案:

答案 0 :(得分:9)

我只使用JAXB,它允许将对象树(带注释的类)编组为XML,并将XML解组为对象树。还有其他的Object to XML API,但是JAXB附带了Java SE并且运行良好。

答案 1 :(得分:2)

使用XStream,您可以序列化大多数Java对象,无需任何映射。对象名称成为生成的XML中的元素名称,类中的字符串构成XML的元素内容。使用XStream序列化的类不需要实现Serializable接口。 XStream是一个序列化工具,而不是数据绑定工具,这意味着它不会从XML或XML架构定义(XSD)文件执行类生成

答案 2 :(得分:1)

在我看来,您需要Builder模式或Factory模式。查看维基百科了解更多详情。我会选择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 () {...}
}

答案 3 :(得分:0)

SAXParser需要ContentHandler

你必须实现startElement ... endElement ......以及其他几个。

您可以更改解析策略,读取startElement方法中的元素。

我相信应该很容易。

This article读得很好。


此外,如果你不断创建像void createZooElement(Zoo)这样的方法,你最终会在一天结束时使用无法管理的数百种方法。

答案 4 :(得分:0)

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

XMLBean需要XML架构。

JiBXcastor需要一个映射文件。