【发布时间】:2010-11-03 09:04:08
【问题描述】:
我们都知道日志,好吧,但我们为什么要把 «Logger» 类视为单例类呢?如果我们把它变成一个普通的 non-singleton 类会发生什么?
【问题讨论】:
标签: design-patterns logging singleton
我们都知道日志,好吧,但我们为什么要把 «Logger» 类视为单例类呢?如果我们把它变成一个普通的 non-singleton 类会发生什么?
【问题讨论】:
标签: design-patterns logging singleton
我在 IBM 网站上找到了这个。它很好地解释了 Logger Singleton 类的用法。
真正单例的经典例子 是一个日志服务。假设我们有 基于事件的日志服务:客户端 对象请求记录文本 向日志发送消息 服务。其他对象实际记录 某处的文本(控制台、文件、 无论如何)通过收听日志记录 这些日志记录请求的服务和 处理它们。首先,请注意 日志服务通过经典 测试单身:
- 请求者需要一个众所周知的对象来向其发送请求 日志。这意味着一个全局点 访问。
- 由于日志服务是一个单一的事件源,多个 听众可以注册,只有 必须是一个实例。
这里是链接:Use your singletons wisely
如果您不使用单例类,则必须处理这些不同记录器实例之间的同步(写入文件或您使用的任何流)。因此,当您只有一个全局 Logger 实例时,它会容易得多。
【讨论】:
主要问题是实际日志的持久化位置。
如果您在文件系统上编写,拥有多个实例(因此,可能有多个线程)可能会导致文件乱码。
从某种意义上说,取决于缓冲和其他低级机制,来自一次写入的消息可能最终与来自其他写入的消息(或部分消息)混合。
这可能是一个小问题,但这是我能想到的唯一一个关于只有一个(因此是串行的)日志写入对象的问题。
【讨论】:
如果您有多个具有不同内容的日志流,则可以使用为不同输出初始化的记录器类的多个实例。
但是,如果您只有一个日志流,则拥有多个记录器类实例会导致实现更复杂,因为这些实例必须协同工作来管理实际资源。例如,考虑一个记录器,它使用序列号记录每条消息。两个实例必须同步它们的序列计数器,这需要它们相互了解,协商计数器增加等等。 (在静态类成员中使用共享计数器的替代方法等同于使用单例记录器)
【讨论】:
取决于日志框架。通常您希望所有消息都进入一个日志,因此您希望所有代码使用同一个记录器。但是 logger-class 不必是单例来确保这一点。
【讨论】: