工厂函数应该作为静态成员还是在命名空间中属于自己的类?在创建类工厂时,我必须使用一个意义吗?
在我的例子中,工厂生成的类是具有不同内存结构的容器对象。像
这样的东西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 );
如果我使用模板化的工厂类。除此之外,还有两种方法可以解决相同的问题吗?
感谢。
答案 0 :(得分:0)
无论哪种方式,你都会得到一个愚蠢名字的全球化。但是代码的大多数读者都希望它是它创建的东西的静态成员,即Parent。这对我来说是一个熟悉的模式,但使用其他一些命名空间似乎无关紧要和奇怪。
答案 1 :(得分:0)
这取决于。没有真正的答案。在很多情况下, 只有用户可见的类才是抽象基类;该 声明并定义工厂正在构建的实际类 在源文件中的未命名命名空间中。在这种情况下, 显然,工厂函数将在命名空间中, 在标题中声明。如果你的这种模式被使用了 应用程序,然后保持一致是有意义的,并声明 您在命名空间范围内的所有工厂函数。除此以外, 这更像是一种风格问题。做哪个对你感觉最好。 (但要保持一致。)