我目前正在尝试实现工厂设计模式,并且对于如何在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;
}
}
所以我的问题:
现在我相信有些情况下静态方法是有意义的(例如静态'目前存在多少这些类'),但这似乎不是一种情况。这是必要的。有什么想法吗?
编辑:所以我只是想了一下,我列出的例子并不是典型的'工厂方法。实际上,工厂函数可能更复杂并且需要调用其他函数(私有类方法)。在这种情况下,将工厂包装成一个类可以访问子函数是完全合理的。这是为什么工厂方法通常包含在类中的原因吗?
答案 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>();
换句话说,如果您使用命名空间,则只能定义功能模板,在任何情况下都不能是最佳解决方案。
此外,您不能像创建类一样创建别名,因此您必须明确任何调用位置的类型,并且它可能容易出错并且难以重构。