单例类

8
单例类和所有静态成员(即方法和属性)的类之间有什么区别?
我找不到任何一个“所有静态成员类”不能实现与正确实现单例模式的类相同功能的实例?
例如,java.lang.Runtime是一个正确的单例类,而java.lang.System具有所有静态方法以进行访问,并且仅具有私有构造函数以避免外部构造。有人知道为什么像Runtime这样的类被制作为Singleton,而不像java.lang.System一样实现。
这仅仅是因为它会是更干净的设计(即更真实地模仿对象),还是这里有一些性能优势?
8个回答

15

没错,单例和接口是有区别的 - 单例可以实现一个接口。

此外,从外部看起来像单例的东西实际上可以通过不同的类来实现,其中单例访问方法(例如 Runtime.getRuntime())可以在执行时创建正确的实例。我不是说这就是发生了什么,但这是一种选择。


3
哇,你在不到一分钟内获得了3个赞。你有粉丝或者什么的吗? - default
@Default 这个很棒!我猜这得归功于 Jon Skeet 的帮助 :-) - CoolBeans
3
Jon Skeet的跟踪者俱乐部,我是成员。 - mauris
1
@Jon Skeet:很高兴没有为您提供服务 :-) - JeremyP
8
@默认情况下,Skeet已经达到了声誉奇点。如果投票靠近他的事件视界,它们就会被吸进去,永远不会再被看到。我知道,我们都对此感到不满。然而,请放心。由于声誉机械不确定性原理,他的声誉最终将会消散。这被称为Skeet辐射。 - user1228
显示剩余6条评论

3

您可以使用Serializable接口(在Java中)对对象(包括Singleton)进行序列化和反序列化,但不能对静态类进行操作。


1

单例模式只被实例化一次。

静态类从不被实例化。


2
这取决于语言。例如在Java中,当类被类加载器加载并且可能具有静态初始化块时,它被实例化。 - falstro

0
单例模式被设计模式所引用的主要目的是提供一个多态的服务,其中单例是一个抽象基类,并且具体类型在运行时决定。当然,在程序中只能有一个实例存在。

0

我认为从原则上讲,所谓的单例和所有静态方法/成员的类之间没有区别。实际上,我认为创建一个具有所有静态成员的类是实现单例习惯用法的一种方式。也许在Java中有某种严重的区别,但我是从C++的角度来说的。


0
我认为你应该问 final 类和私有构造函数以及静态类之间的区别。因为单例模式是一个类,实现取决于编写此类的程序员。 这就像询问对象和静态类之间的区别一样。

0
一个类可以被扩展以创建另一个单例(例如用于测试目的)或非单例类。静态方法不能被覆盖,它们只能在子类中隐藏。

0

单例模式的常见用途是使用延迟初始化(也称为Meyers单例)来控制静态对象初始化的顺序(在C++中,这在不同的翻译单位之间是未定义的)。在这方面,单例就像全局对象一样,但其构造顺序表现良好。

然而,控制销毁顺序变得非常困难。如果您必须依赖于单例以某种特定顺序被销毁(例如,一个应该比其他单例实例更持久的单例记录类),请参阅Alexandrescu的书籍以了解其中的困难。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接