如何基于XML代码构造对象?

时间:2010-06-01 17:09:06

标签: c++ factory factory-pattern

我有XML文件,代表HTML代码的一部分 这些XML文件也有小部件声明 示例XML文件:

 <message id="msg">
   <p>
     <Widget name="foo" type="SomeComplexWidget" attribute="value">
        inner text here, sets another attribute or 
        inserts another widget to the tree if needed...
     </Widget>
   </p>
 </message>

我有一个主要的Widget类,我的所有小部件都继承自 问题是我将如何创建它? 以下是我的选择:

  1. 创建一个编译时工具,该工具将解析XML文件并创建必要的代码以将小部件绑定到所需的对象。
    • 优点:
      • 没有额外的运行时开销导致系统。
      • 绑定setter很容易。
    • 缺点:
      • 向构建链添加另一个步骤。
      • 难以维护,因为系统中的每个小部件都应添加到解析器中。
      • 使用宏来绑定小部件。
      • 复杂代码
  2. 找到一种方法,将所有小部件自动注册到工厂。
    • 优点:
      • 所有绑定都是完全自动完成的。
      • 更容易维护然后选项1,因为每个新窗口小部件只需要调用一个注册它的WidgetFactory方法。
    • 缺点:
      • 不知道如何在不引入可维护性噩梦的情况下绑定setter。
      • 添加内存和运行时开销。
      • 复杂代码
  3. 您认为哪种更好?你们能提出更好的解决方案吗?

2 个答案:

答案 0 :(得分:1)

我不确定您发布的变体,但最简单的方法(不是最有效的,更像“get-it-done”方法)将为boost::serialization库编写加载包装器。

在这种情况下,您必须调用反序列化例程,指向文件(或它的映射部分)并检索可以在窗口小部件容器中注册的构造对象。

请注意,您可能不需要编写相应的保存(序列化)例程,只需编写加载例程。

另请注意,您可以将一些简单(可能是自我实现的)解析器与反序列化例程结合使用,例如,第一个解析器会抓取与您的Widget相关的代码,第二个从中构造一个对象。

答案 1 :(得分:1)

创建工具,将其包含在构建步骤中,一切都会好的。

有关其他详细信息,请参阅我之前回答的评论。