当前位置: 首页 > 面试题库 >

Singleton和Static Utility类

易琛
2023-03-14
问题内容

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

澄清:

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


问题答案:

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

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

  public static final END_OF_SEQUENCE_MARKER=new EndMarker();

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

编辑

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

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


 类似资料:
  • 此模式将类的实例化限制为一个对象。 它是一种创建模式,只涉及一个类来创建方法和指定的对象。 它提供了对创建的实例的全局访问点。 如何实现单例类? 下面的程序演示了singleton类的实现,它打印多次创建的实例。 class Singleton: __instance = None @staticmethod def getInstance(): """ Stati

  • currentLocation具有有效的位置值。有什么提示吗?谢谢

  • Google Singleton Detector 简称为 GSD 是一个通过分析 Java 字节码来检测 Java 中单件(Singletons)的使用。

  • 问题内容: 考虑我有一个Singleton类,定义如下。 根据我的上述定义满足了Singleton的要求。添加的唯一额外行为是该类实现了可序列化的接口。 如果另一个类X获得了单例的实例并将其写入文件,然后在以后将其反序列化以获取另一个实例,则将有两个实例违反了Singleton原理。 我该如何避免这种情况,或者我在上述定义本身中错了。 问题答案: 最好的方法是使用枚举单例模式: 这样可以保证对象的

  • 另外,我将.kt反编译回Java。在companion类中,我得到以下代码。 } 1)如何通过在kotlin同伴对象中使用lateinit或lazy来实现线程安全、单例?正如我所看到的,反编译的java代码在initialize函数中有一个synchronized调用,但在synchronize正文中没有。

  • 4.9. 粘合代码和可怕的singleton 一个应用中的大多数代码最好写成依赖注入(控制反转)的风格,这样代码就和Spring IoC容器无关,它们在被创建时从容器得到自己的依赖,并且完全不知道容器的存在。然而,对于少量需要与其它代码粘合的粘合层代码来说,有时候就需要以一种singleton(或者类似singleton)的方式来访问Spring IoC容器。例如,第三方的代码可能试图(以Clas