单例和静态实用程序类 [已关闭]
2022-09-02 12:48:05
哪些因素会影响要使用的适当设计模式?
澄清:
我问这个问题的原因是因为我正在设计一个需要多个静态工厂类和单例管理器类的应用程序。有时,我对我应该采用哪种设计感到困惑,我认为询问这个社区为什么以及何时可能有助于我澄清一些事情。
哪些因素会影响要使用的适当设计模式?
澄清:
我问这个问题的原因是因为我正在设计一个需要多个静态工厂类和单例管理器类的应用程序。有时,我对我应该采用哪种设计感到困惑,我认为询问这个社区为什么以及何时可能有助于我澄清一些事情。
当需要实例化单个对象并且所有请求的对象访问都通过此特定实例时,将使用单例。如果需要,此对象可以保持状态。
静态实用工具在具有仅是无状态实用工具函数的类时使用。它不维护状态。永远不会实例化对象的实例。
我使用静态实用程序类来共享函数,这些函数将从许多不同的上下文中调用 - 例如,类似于java.util.Math中的数学函数。这是一个适当的模式,假设这些是“纯”函数(即不操作任何状态或访问除给定参数以外的任何数据)。
我很少使用单例,特别是尽量避免全局单例。它们遭受了与全局变量相关的所有常见问题。它们使测试变得困难,除非你的单例也是不可变的,否则它们会引入全局状态的问题。我发现它们有用的主要地方是依赖于对象标识的性能黑客 - 例如:
public static final END_OF_SEQUENCE_MARKER=new EndMarker();
然后,在遍历序列时,您可以只测试是否(object==END_OF_SEQUENCE_MARKER)。因为它是一个静态的最终参考,所以JIT将把它变成一个非常快速的测试。
编辑
刚刚看到您的澄清,一些快速的额外评论: