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

时间:2016-12-05 02:05:20

标签: 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;
     }
}

所以我的问题:

  • 我描述的命名空间功能是否是有效的替代方案?
  • 定义一个只有静态方法的类是否有意义?使用命名空间似乎更有意义。

现在我相信有些情况下静态方法是有意义的(例如静态'目前存在多少这些类'),但这似乎不是一种情况。这是必要的。有什么想法吗?

编辑:所以我只是想了一下,我列出的例子并不是典型的'工厂方法。实际上,工厂函数可能更复杂并且需要调用其他函数(私有类方法)。在这种情况下,将工厂包装成一个类可以访问子函数是完全合理的。这是为什么工厂方法通常包含在类中的原因吗?

1 个答案:

答案 0 :(得分:0)

  

我描述的命名空间函数是否是有效的替代方法?

  

定义一个只有静态方法的类是否有意义?看起来使用命名空间会更有意义。

您可以使用命名空间无法完成的类来执行某些操作 你提到了其中一个(使用私有成员,即使你可以使用匿名命名空间来做类似的事情 - 实际上不太好)。

另一个相关的例子是你不能模板化命名空间,这可能会非常烦人。
例如,这发生在一个类:

template<typename T>
struct S {
    static T f() { return T(); }
    // Other member functions
};

// ...

using MyS = S<int>;
MyS::f();

模板会发生这种情况:

namespace N {
    template<typename T>
    T f() { return T(); }

    // Other function template
}

// ...

N::f<int>();

换句话说,如果您使用命名空间,则只能定义功能模板,在任何情况下都不能是最佳解决方案。
此外,您不能像创建类一样创建别名,因此您必须明确任何调用位置的类型,并且它可能容易出错并且难以重构。