2010-11-03 152 views

回答

13

我在IBM网站上找到了此处。它很好地解释了Logger Singleton类的用法。

真正的单身人士 的一个典型例子是日志记录服务。假设我们有一个基于事件的日志记录服务 :客户端 对象请求文本被记录日志 发送消息到记录 服务。通过监听这些日志记录请求的日志记录 服务和处理它们的 ,其他对象实际上在某处(控制台,文件, )记录了 文本。首先,请注意 日志服务通过经典 测试,作为一个单身:

  • 请求者需要一个众所周知的对象,该对象将请求发送到 日志。这意味着访问的全局点为 。
  • 由于日志记录服务是多个 听众可以注册的单个事件源,因此只有 需要是一个实例。

下面的链接:Use your singletons wisely

如果你不会使用一个单独的类,你将不得不处理这些不同的记录器之间的同步(写入文件,或者任何你使用流)实例。所以当你只有一个全局Logger实例时,它更容易。

0

取决于日志框架。通常你想要所有的消息都去一个日志,所以你想要所有的代码使用相同的记录器。但是记录器类并不一定是一个单独的东西来确保这一点。

2

主要问题是实际日志持续存在的位置。

如果您正在一个文件系统上编写,有多个实例(因此可能会有多个线程)可能会导致出现乱码文件。

从某种意义上说,根据缓冲和其他低级机制,来自一个写入的消息可能最终与来自其他消息的消息(或消息的一部分)混合在一起。

这可能是一个小问题,但它是我能想到的关于只有一个(因此是串行)日志写入对象的唯一的问题。

2

如果您有多个具有不同内容的日志流,则可以使用针对不同输出初始化的多个记录器类实例。

但是,如果您只有一个日志流,则具有多个日志记录类实例会导致更复杂的实现,因为实例必须一起工作来管理实际资源。例如考虑一个记录器,每个消息记录一个序列号。两个实例将不得不同步他们的序列计数器,这要求他们相互讨论,协商计数器增加等等。(在静态类成员中共享计数器的替代方案相当于具有单例记录器)

相关问题