c++ - 何时使用静态类函数而不是命名空间函数?

标签 c++ namespaces factory static-methods

我目前正在尝试实现工厂设计模式,但对 C++ 中通常如何实现这一点有些困惑。我一直在指this网页。

因此,在该网页上,他们展示了一个示例,其中定义了一个名为 ComputerFactory 的工厂类。该类有一个静态的 NewComputer 方法。

 class ComputerFactory
 {
 public:
     static Computer *NewComputer(const std::string &description)
     {
         if(description == "laptop")
             return new Laptop;
         if(description == "desktop")
             return new Desktop;
         return NULL;
     }
 };

NewComputer 是静态的这一事实意味着它不与 ComputerFactory 的单个实例关联。因此,可以通过编写代码从代码中调用此方法

ComputerFactor::NewComputer("description");

现在我很好奇为什么需要将其包装在一个类中。因为它是静态的并且实际上并不意味着与任何类关联,所以做类似的事情会更有意义

namespace ComputerFactory
{
     static Computer *NewComputer(const std::string &description)
     {
         if(description == "laptop")
             return new Laptop;
         if(description == "desktop")
             return new Desktop;
         return NULL;
     }
}

所以我的问题:

  • 我描述的命名空间函数是有效的替代方案吗?
  • 定义一个仅具有静态方法的类是否有意义?看起来使用命名空间更有意义。

现在我相信在某些情况下使用静态方法是有意义的(例如静态“当前存在多少个此类”),但这似乎不是必要的情况。有什么想法吗?

编辑:所以我只是有一个想法,我列出的示例不是“典型”工厂方法。在实践中,工厂函数可能更复杂并且需要调用其他函数(私有(private)类方法)。在这种情况下,将工厂包装到一个类中以便您可以访问子函数是完全有意义的。这就是工厂方法通常被包装到类中的原因吗?

最佳答案

Is the namespace function I described a valid alternative?

是的

Would it ever make sense to define a class that only has static methods? It seems like it would make more sense to use a namespace.

如果这些方法是可以在许多类中使用的实用方法,那么将它们放在命名空间中会更有意义。

如果这些方法是特定于类的,那么将它们设置为类本身的静态,这样可以实现更好的封装。

关于c++ - 何时使用静态类函数而不是命名空间函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40966089/

相关文章:

raspberry-pi - 使用 VPN 在网络命名空间中运行传输守护进程

java - 如果我在工厂类中实现 ThreadLocal 会发生什么

c++ - 避免虚拟模板函数

c++ - C++程序崩溃中的文件读取错误

c# - 如何添加xml命名空间

php - 使用 phpmailer 在路由中调用函数

c# - 通用工厂问题、运行时转换和协变/逆变问题

c++ - 营养转换器的食谱

c++ - Visual Studio 2015中的C++调试器可执行文件在哪里?

c++ - 如何组合两个查询并将第一个查询的结果用作第二个查询的输出