From
Martin Reddy 的 C++ API 设计 - 第 3 章(第 3.3.3 节)
可扩展工厂示例)
我发现工厂模式的这种实现非常高效,它允许用户在运行时注册回调函数(本质上是派生类的构造函数),最终可以在创建该类型的对象时调用该回调函数。代码如下所示,摘自教科书 -
文件:rendererfactory.h
class RendererFactory
{
public:
typedef IRenderer *(*CreateCallback)();
static void RegisterRenderer(const std::string &type, CreateCallback cb);
static void UnregisterRenderer(const std::string &type);
static IRenderer *CreateRenderer(const std::string &type);
private:
typedef std::map<std::string, CreateCallback> CallbackMap;
static CallbackMap mRenderers;
};
文件:渲染器工厂.cpp
#include "rendererfactory.h"
// instantiate the static variable in RendererFactory
RendererFactory::CallbackMap RendererFactory::mRenderers;
void RendererFactory::RegisterRenderer(const std::string &type, CreateCallback cb)
{
mRenderers[type] = cb;
}
void RendererFactory::UnregisterRenderer(const std::string &type)
{
mRenderers.erase(type);
}
IRenderer *RendererFactory::CreateRenderer(const std::string &type)
{
CallbackMap::iterator it = mRenderers.find(type);
if (it != mRenderers.end())
{
// call the creation callback to construct this derived type
return (it->second)();
}
return NULL;
}
class UserRenderer : public IRenderer
{
public:
~UserRenderer() {}
static IRenderer *Create() { return new UserRenderer(); }
};
文件:main.cpp
int main(int, char **)
{
// register a new renderer
RendererFactory::RegisterRenderer("user", UserRenderer::Create);
// create an instance of our new renderer
IRenderer *r = RendererFactory::CreateRenderer("user");
r->Render();
delete r;
return 0;
}
我对这段代码的限制是它假设是派生对象的构造函数,不带任何参数。例如,如果我有一个派生类 -
class UserRendererMultiArgs : public IRenderer
{
public:
UserRendererMultiArgs(int, int);
~UserRendererMultiArgs() {}
static IRenderer *Create() {
return new UserRendererMultiArgs(); //Incorrect : need to call UserRendererMultiArgs(int, int) ???
}
};
我将如何实现在 RendererFactory 类维护的映射中使用变量参数注册回调的相同结果?
我虽然使用了 varargs 但我不知道该怎么做?!