design-patterns - 应用程序设置管理器的单例模式的替代方案

标签 design-patterns singleton settings application-settings

我已经阅读了单例导致代码出现问题的所有原因,但在以下场景中我找不到替代方案。
我有一个 Java Swing 应用程序。用户可以通过 GUI 设置影响应用程序的显示和功能的设置,这些设置从 XML 配置文件中存储和检索。加载应用程序时,会构造一个 SettingsManager 对象。在构造函数中,设置管理器解析 XML 配置文件并将所有设置存储在本地以便快速访问(我将其称为缓存)。当应用程序中的设置发生更改时,该设置会立即写入文件,但缓存会同时更新。
问题
如果设置管理器的多个实例被创建,当一个实例中的一个设置被更改时,其他的缓存变得陈旧。如果不使用单例,解决此问题的一种可能方法是不使用缓存并始终从文件中检索设置。这不是一个可怕的想法,但它并不可取。如果我这样做了,我想我必须做一些额外的工作才能使其线程安全。
为什么单例有帮助
如果 SettingsManager 是 Singleton,则只有一个缓存,因此它永远不会过时。但是,我已经看到这不是一个好主意,因为它现在本质上是一个全局变量,不需要访问设置的类现在可以访问它们。从我一直在阅读的内容来看,还有很多其他问题。
那么有没有其他方法可以在不使用单例的情况下解决问题?

最佳答案

您可以实现它,以便在类内部将 SettingsManager 作为 Singleton 进行管理(此类显然不会是单例),并且此类实例只会注入(inject)到那些需要它的类中。 handle 体(AKA 桥)可以很好地工作。

这将为您提供两者中最好的:

  • SettingsManager 只实例化一次,它的缓存也是如此。并且缓存永远不会过时。
  • 只有需要它的对象才能访问它

  • 显然,这个句柄主体类(或任何其他解决方案)可以在任何地方实例化,从而绕过依赖注入(inject)。所以我不确定这个问题的完美解决方案是否存在,但这可以让你更接近一些。

    关于design-patterns - 应用程序设置管理器的单例模式的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11038795/

    相关文章:

    class - 具有与 Class 本身相同类型的类变量

    java - 仅在没有检查的情况下,空对象模式是否有意义?

    ios - singleton 类中的失败初始化与 swift 中的私有(private)初始化器

    c# - 如何绕过应用程序范围设置为只读?

    python - 状态模式 - Django 模型

    c# - 使用什么设计模式来验证数据和创建对象

    Scala 单例作为另一个类的实例

    Java单例用法

    c# - 在 Settings.setting 文件中添加新设置

    javascript - 如何检测 IE 是否作为可信站点访问我的站点?