C ++中的工厂模式和类模板

时间:2010-08-11 17:20:21

标签: c++ design-patterns templates factory

我有一个类模板的层次结构。层次结构的顶部是一个抽象基类(接口)。我不知道在运行时实例化哪个具体实现,所以使用工厂模式似乎是完美的情况。但是,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>;
   }
};

2 个答案:

答案 0 :(得分:3)

为什么你不能在IProductFactory上对T进行模板化?这样就可以摆脱你的错误,并且不会那么普遍。客户仍然需要知道T是什么才能调用createProduct方法。

编辑回复:评论

为了做到这一点,你需要创建一个模板化的函数来创建工厂。所以:

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

现在您的工厂已经模板化,createProduct方法不再是成员模板。不确定返回ProductAFactoryProductBFactory的条件是什么,但是您必须传入一个字符串进行选择,让它成为另一个可以做出决定的类的成员函数,或者具有多个自由函数,但只将一个版本或另一个版本暴露给特定客户端。

答案 1 :(得分:-1)

这不需要模板。这会消除你的问题吗?