被美化的全局变量 - 变成了一个受尊崇的全局类。有人说这破坏了面向对象的设计。
给我一些场景,除了传统的日志记录器之外,在这些场景下使用单例模式是有意义的。
被美化的全局变量 - 变成了一个受尊崇的全局类。有人说这破坏了面向对象的设计。
给我一些场景,除了传统的日志记录器之外,在这些场景下使用单例模式是有意义的。
Singleton模式需要满足三个要求:
如果你的Singleton只满足其中一到两个要求,重新设计通常是正确的选择。
例如,打印机队列很少会从多个地方调用(只有Print菜单),所以可以使用互斥锁解决并发访问问题。
一个简单的日志记录器可能是可行的Singleton的最明显例子,但在更复杂的日志记录方案中这种情况可能会发生变化。
读取只应在启动时读取的配置文件并将其封装在单例中。
Properties.Settings.Default
。 - Nick Bedford当您需要管理共享资源时,可以使用单例模式。例如,打印机缓冲池。您的应用程序应该只有一个缓冲池实例,以避免对同一资源的冲突请求。
或者是数据库连接、文件管理器等。
只读单例模式可以用于存储某些全局状态(如用户语言、帮助文件路径、应用程序路径),这是合理的。但要注意,不要使用单例模式来控制业务逻辑——单例几乎总是会成为多个实例。
管理与数据库的连接(或连接池)。
我还会使用它来检索和存储外部配置文件上的信息。
单例模式应该用于管理整个应用程序共享的资源访问,并且可能有多个相同类的实例可能会破坏性。确保对共享资源的访问是线程安全的是这种模式非常重要的一个例子。
使用单例模式时,应确保不会意外隐藏依赖项。理想情况下,单例(像大多数应用程序中的静态变量一样)应在初始化代码执行期间设置(C#可执行文件的static void Main(),java可执行文件的static void main()),然后传递给所有其他需要实例化的类。这可以帮助您维护可测试性。
使用单例的一种方式是,覆盖必须有单个“代理”控制对资源访问的实例。单例在记录器中非常好用,因为它们代理对只能被独占写入的文件的访问。对于像记录日志这样的内容,它们提供了一种将写入到类似日志文件的内容抽象化的方式 - 您可以将缓存机制包装到您的单例中等等...
此外,考虑一种情况,您需要一个应用程序具有多个窗口/线程/等,但需要单个通信点。我曾经使用单例来控制我想让应用程序启动的作业。 单例负责序列化作业并将其状态显示给程序中任何其他感兴趣的部分。在这种情况下,您可以将单例看作是在应用程序内部运行的“服务器”类...希望这能帮到您。
我认为单例模式的使用可以被看作是数据库中的一对多关系。如果您的代码中有许多不同部分需要使用同一个对象实例,那么使用单例模式就是明智的选择。