有一个公共(public)模块Logging。还有另外两个模块FooBar将使用Logging提供的功能。一种方法是拥有一个全局Logging对象,并在构造期间将该对象传递给FooBar,后者将维护对该Logging对象的引用。

Logging Logger;
Foo foo(Logger);
Bar bar(Logger);

Bar的某处:
Bar::SomeFunc()
{
    this->Logger.func();
}

这可以工作,但是我必须创建和维护全局Logger对象。同样,如果明天出现另一个像Reporting这样的通用模块,我也必须将其传递给FooBar

另一种方法是使基类Common具有Logger作为静态对象。现在FooBar将从Common继承,并且可以访问Logger公开的功能,并且由于它是静态的,即使FooBar拥有自己的common,也将只有一个底层Logger

这可行,但看起来不像继承的用例。
有没有更好的设计来解决这个问题。

最佳答案

对于日志记录,我个人的建议是使用Singleton Logger类,并通过静态方法进行访问。

如果您需要其他记录器,则可以扩展此Logger类以在其中具有某种形式的依赖项注入(inject),但是要使客户端保持简单并且不要过度设计它们。

这个问题的“设计模式”惯用答案是使用依赖注入(inject)。
FooBar将具有一个构造函数,该构造函数使用ILogger *指针并将其存储在内部。您将通过该指针登录。 Foo&Bar的用户会将指针传递到相关的Logger实现。

我不喜欢这种简单用例的解决方案,而且我认为这不是一个好的设计。我只是为了完整性而添加它。

09-10 07:29
查看更多