有一个公共(public)模块Logging
。还有另外两个模块Foo
和Bar
将使用Logging
提供的功能。一种方法是拥有一个全局Logging对象,并在构造期间将该对象传递给Foo
和Bar
,后者将维护对该Logging
对象的引用。
Logging Logger;
Foo foo(Logger);
Bar bar(Logger);
在
Bar
的某处:Bar::SomeFunc()
{
this->Logger.func();
}
这可以工作,但是我必须创建和维护全局
Logger
对象。同样,如果明天出现另一个像Reporting
这样的通用模块,我也必须将其传递给Foo
和Bar
。另一种方法是使基类
Common
具有Logger作为静态对象。现在Foo
和Bar
将从Common
继承,并且可以访问Logger
公开的功能,并且由于它是静态的,即使Foo
和Bar
拥有自己的common
,也将只有一个底层Logger
。这可行,但看起来不像继承的用例。
有没有更好的设计来解决这个问题。
最佳答案
对于日志记录,我个人的建议是使用Singleton Logger类,并通过静态方法进行访问。
如果您需要其他记录器,则可以扩展此Logger
类以在其中具有某种形式的依赖项注入(inject),但是要使客户端保持简单并且不要过度设计它们。
这个问题的“设计模式”惯用答案是使用依赖注入(inject)。Foo
和Bar
将具有一个构造函数,该构造函数使用ILogger *指针并将其存储在内部。您将通过该指针登录。 Foo&Bar的用户会将指针传递到相关的Logger实现。
我不喜欢这种简单用例的解决方案,而且我认为这不是一个好的设计。我只是为了完整性而添加它。