工厂函数作为类或命名空间中的静态成员?

时间:2014-10-16 12:36:09

标签: c++

工厂函数应该作为静态成员还是在命名空间中属于自己的类?在创建类工厂时,我必须使用一个意义吗?

在我的例子中,工厂生成的类是具有不同内存结构的容器对象。像

这样的东西
template< typename T >
class Parent
{
    virtual void myFunction() = 0;
    // more virtual interface functions...
}

template< typename T >
class ChildA : public Parent< T >
{
    virtual void myFunction() override;
}

template< typename T >
class ChildB : public Parent< T >
{
    virtual void myFunction() override;
}


template< typename T >
Parent< T >* factory( PerformanceTraits traits );

我看了一下Namespace + functions versus static methods on a class,还看了Scott Meyers关于这个主题的内容,但我似乎无法将其应用于工厂功能。

如果我使用命名空间,我可以写

Parent* obj = MyFactoryNamespace::factory< int >( traits );

相比
Parent* obj = MyFactoryClass< int >::factory( traits );

如果我使用模板化的工厂类。除此之外,还有两种方法可以解决相同的问题吗?

感谢。

2 个答案:

答案 0 :(得分:0)

无论哪种方式,你都会得到一个愚蠢名字的全球化。但是代码的大多数读者都希望它是它创建的东西的静态成员,即Parent。这对我来说是一个熟悉的模式,但使用其他一些命名空间似乎无关紧要和奇怪。

答案 1 :(得分:0)

这取决于。没有真正的答案。在很多情况下, 只有用户可见的类才是抽象基类;该 声明并定义工厂正在构建的实际类 在源文件中的未命名命名空间中。在这种情况下, 显然,工厂函数将在命名空间中, 在标题中声明。如果你的这种模式被使用了 应用程序,然后保持一致是有意义的,并声明 您在命名空间范围内的所有工厂函数。除此以外, 这更像是一种风格问题。做哪个对你感觉最好。 (但要保持一致。)