单例和静态实用程序类 [已关闭]

2022-09-02 12:48:05

哪些因素会影响要使用的适当设计模式?

澄清:

我问这个问题的原因是因为我正在设计一个需要多个静态工厂类和单例管理器类的应用程序。有时,我对我应该采用哪种设计感到困惑,我认为询问这个社区为什么以及何时可能有助于我澄清一些事情。


答案 1

当需要实例化单个对象并且所有请求的对象访问都通过此特定实例时,将使用单例。如果需要,此对象可以保持状态。

静态实用工具在具有仅是无状态实用工具函数的类时使用。它不维护状态。永远不会实例化对象的实例。


答案 2

我使用静态实用程序类来共享函数,这些函数将从许多不同的上下文中调用 - 例如,类似于java.util.Math中的数学函数。这是一个适当的模式,假设这些是“纯”函数(即不操作任何状态或访问除给定参数以外的任何数据)。

我很少使用单例,特别是尽量避免全局单例。它们遭受了与全局变量相关的所有常见问题。它们使测试变得困难,除非你的单例也是不可变的,否则它们会引入全局状态的问题。我发现它们有用的主要地方是依赖于对象标识的性能黑客 - 例如:

  public static final END_OF_SEQUENCE_MARKER=new EndMarker();

然后,在遍历序列时,您可以只测试是否(object==END_OF_SEQUENCE_MARKER)。因为它是一个静态的最终参考,所以JIT将把它变成一个非常快速的测试。

编辑

刚刚看到您的澄清,一些快速的额外评论:

  • 静态工厂类通常没有意义。工厂类的全部意义在于,您可以实例化它(或子类!),对工厂对象进行一些配置更改,然后使用它根据所需的配置生成对象实例。如果你要让它成为静态的,你也可以创建一个静态的MyObject.create(..)方法,而不是有一个完整的静态MyObjectFactory类。
  • 同样,为什么有一个单独的单例管理器类?通常,管理单例的最佳类是单例类本身,因为您通常需要它来访问私有构造函数,假设您要保证只创建一个实例。只需使用一个简单的静态MySingleton.getInstance()方法通常就可以完成您需要的一切。

推荐