【问题标题】:Factory pattern and class templates in C++C++ 中的工厂模式和类模板
【发布时间】:2010-08-11 17:20:20
【问题描述】:

我有一个类模板的层次结构。层次结构的顶部是一个抽象基类(接口)。直到运行时我才知道要实例化哪个具体实现,因此使用工厂模式似乎是完美的情况。但是,C++ 中不允许使用虚成员函数模板。

如何在 C++ 中实现类似于以下的合法设计?

IProduct 接口的各个具体实现以及具体工厂将存在于不同的动态库中,其中一个或多个将在运行时加载。

template<class T> class IProduct
{
public:
   virtual void doWork(const T & data) = 0;
};

template<class T> class ProductA : public IProduct<T> {/*...*/};
template<class T> class ProductB : public IProduct<T> {/*...*/};

class IProductFactory
{
public:
   template<class T> virtual IProduct<T> * createProduct() = 0;
};

class ProductAFactory: public IProductFactory
{
public:
   template<class T> virtual IProduct<T> * createProduct()
   {
      return new ProductA<T>;
   }
};

class ProductBFactory: public IProductFactory
{
public:
   template<class T> virtual IProduct<T> * createProduct()
   {
      return new ProductB<T>;
   }
};

【问题讨论】:

  • 你用模板参数做什么?如图所示,您似乎应该直接删除它。
  • @Zack,模板参数用作接口功能之一的参数类型。我会澄清的。
  • 如上所述,您要求实例化麻烦 - 有人将不得不实例化 ProductA&lt;T&gt;::doWorkProductB&lt;T&gt;::doWork 等,对于主程序所需的所有 T,如果 ProductA、ProductB、等隐藏在共享库中,可能无法这样做。

标签: c++ design-patterns templates factory


【解决方案1】:

为什么你不能在T 上模板化IProductFactory?那将消除您的错误,并且同样普遍。客户端仍然需要知道T 是什么才能调用createProduct 方法。

编辑回复:评论

为此,您只需创建一个模板化函数来创建工厂。所以:

template<class T> IProductFactory<T>* getProductFactory();

现在您的工厂已模板化,createProduct 方法不再是成员模板。不确定返回 ProductAFactoryProductBFactory 的标准是什么,但您要么必须传入一个字符串以进行选择,要么将其作为另一个类的成员函数来做出决定,或者拥有多个免费的功能,但只向特定客户端公开一个或另一个版本。

【讨论】:

  • 是的,这是这里唯一有意义的解决方案。
  • 我也是这么想的,但这不就是把问题推到更高的层次吗?考虑一个想要制作 IProduct 的客户。客户端仍然需要获得一个合适的具体 IProductFactory,这意味着需要有一些东西可以多态地创建 IProductFactory。我错过了什么吗?
【解决方案2】:

这不需要模板。这是否消除了您的问题?

【讨论】:

  • 请详细说明...如何从设计中消除模板参数?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多