静态成员类与普通的c-like接口

Xeo*_*Xeo 5 c++ design-patterns static-members service-locator

嘿.
这里阅读关于服务定位器模式之后,它让我想到一个只有静态成员的类真的是要走的路,或者正常的类似c的interace是不合适的.我发现class当人们甚至不需要它时,他们会一直在关注关键词.
从链接页面获取静态成员类的示例:

class Locator
{
public:
    static IAudio* GetAudio() { return service_; }

    static void Register(IAudio* service)
    {
        service_ = service;
    }

private:
    static IAudio* service_;
};
Run Code Online (Sandbox Code Playgroud)

这是一种可以做到的方式:

// in .h
namespace Locator{
    IAudio* GetAudio();
    void Register(IAudio* service);
}

// in .cpp
namespace Locator{
    namespace {
        IAudio* service_;
    }

    IAudio* GetAudio() {
        return service_;
    }
    void Register(IAudio* service) {
        service_ = service;
    }
}
Run Code Online (Sandbox Code Playgroud)

两个示例都可以用Locator::GetAudio()和完全相同的方式调用Locator::Register(...).上面的一个优于其他?它们是一样的吗?有没有更好的方法来实现这一目标?或者仅仅是个人偏好?谢谢你的帮助.:)

Gre*_*ill 3

您的命名空间提案在可维护性方面存在轻微弱点 - 如果您出于某种原因需要更改接口,则必须记住同时更改接口 ( .h) 和实现 ( .cpp),否则直到链接时才可能检测到不匹配。如果您使用class,则编译器可以检测到错误,例如多个参数不匹配。

另一方面,由于service_您的情况中的实现 ( ) 仅出现在文件中.cpp,因此您可以更改定位器的私有实现,而无需强制重新编译依赖于定位器的代码。(常见的基于类的模式可以提供相同的封装。)

这些都是相当小的差异。包含函数的公共命名空间几乎与仅包含静态成员函数的类完全相同。