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

Factory function as static member in class or in namespace?

本文关键字:命名空间 静态成员 函数 工厂      更新时间:2023-10-16

工厂函数应该作为静态成员在自己的类中还是在命名空间中?在创建类工厂时,我必须使用一个意思,这两个意思之间有什么区别吗?

在我的例子中,工厂生产的类是容器对象,它们有不同的内存结构作为支持。类似的东西

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+函数与静态方法,还阅读了Scott Meyers关于这个主题的看法,但我似乎无法将其应用于工厂函数。

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

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

与相比

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

如果我使用模板化的工厂类。除了这是两种写同一件事的方法之外,还有技术上的区别吗?

谢谢。

这取决于情况。没有真正的答案。在很多情况下用户可见的唯一类是抽象基类;这个声明并定义了工厂正在构建的实际类在源文件的未命名命名空间中。在这种情况下,显然工厂函数将在一个名称空间中,在标头中声明。如果在您的应用程序,那么保持一致是有意义的,并声明命名空间范围内的所有工厂函数。否则这更多的是一个风格问题。做你觉得最好的事。(但要保持一致。)

无论哪种方式,您都只需要获得一个名称愚蠢的全局。但大多数代码的读者都希望它是它创建的东西的静态成员,即Parent。这对我来说是一种熟悉的模式,但使用其他名称空间似乎无关紧要,也很奇怪。