替代Singleton Pattern用于应用程序设置管理器

时间:2012-06-14 18:03:48

标签: design-patterns singleton settings application-settings

我已经阅读了Singletons在代码中导致问题的所有原因,但在以下场景中我找不到替代方案。

我有一个Java Swing应用程序。用户可以通过GUI设置影响应用程序显示和功能的设置,并从XML配置文件中存储和检索这些设置。加载应用程序时,将构造一个SettingsManager对象。在构造函数中,设置管理器解析XML配置文件并在本地存储所有设置以便快速访问(我将其称为缓存)。在应用程序中更改设置后,该设置将立即写入文件,但缓存会同时更新。

问题

如果创建了多个设置管理器实例,则在一个实例中更改一个设置时,其他实例的缓存将变为陈旧。不使用单例,一种可能的解决方法是不使用缓存,只是总是从文件中检索设置。这不是一个可怕的想法,但它并不可取。如果我这样做,我认为我还需要做一些额外的工作来使其线程安全。

为什么单身人士帮助

如果SettingsManager是Singleton,则只有一个缓存,因此它永远不会过时。但是,我已经可以看到这不是一个好主意,因为它现在本质上是一个全局变量,而不需要访问设置的类现在可以访问它们。从我一直在阅读的内容中还有很多其他问题。

还有其他一些设计方法可以在不使用Singleton的情况下解决问题吗?

2 个答案:

答案 0 :(得分:0)

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

这将为您提供最好的两个:

  • SettingsManager仅实例化一次,其缓存也是如此。缓存永远不会陈旧。
  • 只有需要它的对象才能访问它

显然,这个handle-body类(或任何其他解决方案)可以在任何地方实例化,避免依赖注入。所以我不确定这个问题的完美解决方案是否存在,但这可以让你走近一步。

答案 1 :(得分:0)

让我跟进Brady的回答,并建议将“handle-body”类的方法声明为 protected 。这将限制其可用性。另一种技术是将类放在包含名称“internal”的包中(例如com.mycorp.abc.internal)。这可能不会限制访问,但它确实向其他开发人员发送了一个明确的消息,即不应该使用类/方法。