小编典典

Singleton和Static Utility类

java

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

澄清:

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


阅读 217

收藏
2020-10-20

共1个答案

小编典典

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

我很少使用单例,尤其是尝试避免全局单例。它们遭受了与全局变量相关的所有常见问题。它们使测试变得困难,并且除非您的单例也不变,否则它们会带来全局状态的问题。我发现它们有用的主要地方是
取决于对象标识的性能黑客 -例如:

  public static final END_OF_SEQUENCE_MARKER=new EndMarker();

然后遍历一个序列时,您只需测试是否(object ==
END_OF_SEQUENCE_MARKER)。由于它是静态的最终参考,因此JIT会将其转变为非常快速的测试…。

编辑

看到您的澄清后,请快速补充一些评论:

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