从文件构建具体对象。有适合的设计模式吗?

时间:2015-10-15 00:36:50

标签: c++ xml design-patterns game-engine building

我不得不说我总是尽量保持代码简洁美观,主要是尽可能使用设计模式。另外,我印象深刻,我没有在互联网上找到任何与此相关的内容(除了简单和非常模糊的例子,主要是使用json的javascript)。

场景是:我必须从文件中解析/构建具体对象,其内容可以是XML,JSON和/或其他格式。下面是一个例子:

具体对象:

// Contains the common states for the entities
struct EntityModel
{
int hp;
int level;
int armor;
int speed;

// Other attributes...
};

class Entity
{
// Stuff (protected/public/private attributes and functions/methods)

private:
EntityModel* m_model; // Pointer to the model used (flyweight)

// Other attributes...
}

文件(在本例中为XML):

<entity name="Skeleton" class="Undead">
   <attributes>
      <hp value="150" />
      <level value="10" />
      <armor value="75" />
      <speed value="15" />
      <width value="32" />
      <height value="32" />
      <experience value="372" />
      <texture value="skeleton.png" />
      <intelligence value="skeleton.script" />
   </attributes>
   <restistances>
      <resist type="Shock" value="30" />
      <resist type="Fire" value="10" />
   </resistances>
   <attacks>
      <spell name="Blizzard" mp="50" damage="130" distance="0" />
      <spell name="Fireball" mp="30" damage="100" distance="0" />
   </attacks>
   <loot>
      <drop item="Gold Coin" min="30" max="50" probability="1" />
      <drop item="Ruby" min="0" max="2" probability="0.7" />
      <drop item="Enchanted Sword" probability="0.25" />
   </loot>
</entity>

这是实体模型与其文件之间关系的示例。还有其他对象必须能够从他们的文件中解析/构建/创建。

有些人可能会说在这种情况下设计模式并不是必需的,正如我在一些实现中看到的那样,尽管我确实认为有一种。整个实体创建系统涉及抽象工厂,池和flyweight模式(向工厂请求createEntity调用,它将查看是否已在池中创建并缓存了flyweight模型,或者创建并缓存新模型)。 / p>

所以,问题是:有没有正确的方法呢?哪一个?

正如我所说,我将根据这个案例的答案并适应其他对象创作。换句话说,我需要一个通用的答案。

如果这篇文章遗漏了一些信息,或者是错误的部分,请原谅我,因为这是我在这里的第一篇文章。

提前致谢。

2 个答案:

答案 0 :(得分:0)

试试_outstandingMethodBlocks。它具有xml,二进制和文本保存格式。它不是太复杂,而且文档很好。

答案 1 :(得分:0)

我推荐使用工厂设计模式的衍生物。

该模式允许您根据标准(例如名称或编号)构造对象。传统模式基于公共基类创建对象。