C ++通用抽象工厂设计问题

时间:2011-01-24 18:39:18

标签: c++ factory-pattern

我目前正在尝试设计一个通用的抽象工厂,并勾勒出以下类设计:

template <typename T>
class TFactory
{
    public:
        template <typename A>
        static T* create(A a);

        template <typename A, typename B>
        static T* create(A a, B b);

        template <typename A, typename B, typename C>
        static T* create(A a, B b, C c);

        static T* destory(T* ptr);
};

然后可以使用工厂:

Factory<MyType>::create(1, "hello");
Factory<MyType>::create<short, const std::string&>(1, "hello");

有没有更好的方法来设计它?这似乎比varargs更好,但仍然让我超载10个函数。

修改

我应该补充一点,因为我将在Factory中使用自定义内存分配器。

3 个答案:

答案 0 :(得分:1)

没有可变参数模板,你可以做的事情不多(除了预处理程序滥用,但我看不到干净利落的方法,即没有代码生成器)。

如果你打算不重新发明轮子,请看boost::make_shared

顺便说一句,这不是一个抽象的工厂。抽象工厂是多态类。

答案 1 :(得分:1)

你可以在Boost库中找到这种工作,比如Bind和Lambda。

Here是一个Lambda表达式列表,它包含构造函数/析构函数和new / delete。你既可以使用它们,也可以从中受到启发,自己编写。

例如,使用Lambda构造函数,您可以拥有以下内容:

template <typename T> class TFactory {
    public:
        template <typename A>
        static T* create(A a) {
          return new a(); //where a wraps a binded constructor call.
        }; 
};

然后你将使用create函数,如下所示:

Factory<MyType>::create(boost::bind(boost::lambda::constructor<MyType>(),1,"hello"));

我相信你可以找到一种方法让它看起来更漂亮(可能是#define)。

答案 2 :(得分:1)

听起来你正在寻找的是Varardic Templates,它将作为C ++ 0x标准的一部分引入。