有一个公共模块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
。
另一种方法是使Logger作为静态对象的基类Common
。现在Foo
和Bar
将从Common
继承并可以访问Logger
公开的功能,并且即使Foo
和Bar
也是静态的,会有自己的common
,只有一个基础Logger
。
这有效,但看起来不像是继承的用例。 有更好的设计来解决这个问题。
答案 0 :(得分:0)
对于日志记录,我个人的建议是使用单例Logger类,并通过静态方法访问它。
如果您需要不同的记录器,则可以扩展此Logger
类以在其中进行某种形式的依赖注入,但要使客户端保持简单并且不要过度设计它们。
对此问题的“设计模式”惯用答案是使用依赖注入。
Foo
和Bar
将具有一个构造函数,该构造函数使用ILogger *指针并将其存储在内部。您将通过该指针登录。 Foo&Bar的用户会将指针传递到相关的Logger实现。
我不喜欢这种简单用例的解决方案,我认为这不是一个好的设计。我只是为了完整性而添加它。