带有singleton容器的c++工厂模式组件创建者

c++ factory pattern component creator with singleton container

本文关键字:工厂 模式 组件 创建者 c++ singleton 带有      更新时间:2023-10-16

我正在实现用于组件创建的工厂模式,并希望为工厂创建的每种类型的所有实例实现一个单例容器。理想情况下,这将是工厂中创建的每种类型的一个向量。

如果我能在向量中保留基类指针,这将非常容易,但遗憾的是,我的用例非常希望所有实例都连续存储,而不是放在新实例所在的位置,以获得尽可能多的缓存命中率。

我正在考虑为工厂地图做这样的事情:

Map<string,pair<constructorFnPtr, vector<baseClass>>

这会导致派生类中的数据在强制转换为基类时丢失。

我还认为,将指向向量的指针作为对的第二个成员是一个很好的方法,但我不确定如何在每个向量中存储不同的数据类型的情况下实现这一点。我认为这是不可能的,因为模板化的向量在技术上都是不同的类。

有什么办法做我想做的事吗?在过去的几天里,我一直在努力想办法,但没有成功。

或者,如果有另一种存储向量的好方法(即作为组件类的静态成员),我也愿意接受任何类似的建议!

我不会考虑使用组件的工厂模式,而是使用对象池模式,因为您可能希望使用工厂模式来管理实体的创建。

我对所有组件使用一个基本的Component类。这使我能够管理每个组件的一些静态运行时类型信息,并公开一组通用方法。然后,我实现了一个接口IComponentPool,它是我的组件对象池的契约。然后我定义了一个从IComponentPool派生的模板类ComponentPool<T>。在这个模板类中,我管理两个向量/数组。然后是一个ComponentPoolMap,它公开了一些类似映射的行为,以基于组件类型查找ComponentPool<T>

现在在ComponentPool<T>类中,第一个数组是用作查找的稀疏数组。它保存一个索引偏移,该偏移指向第二个密集封装阵列中组件所在的位置。稀疏数组可以只是获取EntityId并将其转换为组件所在位置的一种方法。如果您愿意,可以在这种类型的框架之上轻松实现更复杂的句柄系统。

这里的想法是,压缩密集型充当连续内存缓冲区,您可以在紧密循环中轻松地在缓存友好型庄园中迭代,但稀疏阵列为组件提供了基于每个实体的单一级别的间接查找。

现在,工厂模式是创建实体的EntityEntityId句柄,并为游戏创建所有必要的方面,这些方面构成了兽人、僵尸或其他任何东西。工厂充当了位于游戏对象系统顶部的一层,而ComponentPoolMap可能只是该系统的一小部分。

不能使用连续对象的std::向量来实现这一点。

原因是:工厂应该构建对象,然后返回指向它们的指针。问题是指针将存储在您的应用程序中,而下一次调用your_vector.push_back()可能会使它们无效,正如C++文档所说:

如果新的size()大于capacity(),则所有迭代器和引用(包括过去的结束迭代器)无效。否则,只有过去的结束迭代器无效。

因此,您下一次致电工厂可能会使您之前的所有电话失效。