【发布时间】:2016-10-08 05:38:35
【问题描述】:
通常,对象工厂通过调用来创建类的实例
auto world = ObjectFactory::instance()->create("MatrixTransform");
auto cube1 = ObjectFactory::instance()->create("Cube");
auto sphere = ObjectFactory::instance()->create("Sphere");
它使用没有参数的已注册函数的映射,例如 Node 类是 MatrixTransform、Cube 和 Sphere 类的基类:
// Map of registered factory functions
std::map<std::string, std::function<Node *(void)>> functionRegistry;
现在,我想注册带有有限数量参数(一个或两个)的重载构造函数,例如MatrixTransform(std::string objectName) 或MatrixTransform(std::string objectName, glm::mat4 matrixTransform),这样我不仅可以调用
auto world = ObjectFactory::instance()->create("MatrixTransform");
还有
auto world = ObjectFactory::instance()->create("MatrixTransform", "world");
甚至
auto world = ObjectFactory::instance()->create("MatrixTransform", "world", "glm::mat4())");
我知道可以将具有不同签名的函数存储在映射中,这意味着函数具有不同的参数和/或返回类型,但是如何注册不仅具有不同签名而且具有相同名称的函数,例如鉴于地图中的键必须是唯一的,因此不能重复,所以上面重载了构造函数?如果需要,可以发布整个对象工厂代码。谢谢!
【问题讨论】:
-
你确定这没有被过度设计吗?在没有工厂的情况下直接创建对象真的有优势吗?在您的示例中,我看不到工厂如何击败简单的
auto world = new MatrixTransform(glm::mat4())。我只是考虑使用std::unique_ptr<Node>而不是Node*。 -
@Christian Hackl 我有大量的类共享同一个基类,并且需要在运行时创建特定的实例,所以我开始研究对象工厂模式。当然,最终会使用
std::unique_ptr<Node>而不是Node*。
标签: c++ stl operator-overloading factory