单身人士课程

时间:2010-12-15 08:32:02

标签: java c++ singleton

Singleton类和类之间是否有任何区别? 所有静态成员(即方法和属性)。

我找不到'所有静态成员类'无法实现的任何实例 与正确实现Singleton模式的类相同的功能?

例如。 java.lang.Runtime是一个合适的Singleton类,而java.lang.System有所有静态访问方法,只有一个私有构造函数来避免外部构造。有没有人知道为什么像Runtime这样的课程Singleton而没有像java.lang.System那样实施。

仅仅因为它是一个更清洁的设计(即更真实地模仿一个对象)还是在这里有一些性能优势?

8 个答案:

答案 0 :(得分:15)

是的,有区别 - 单身人士可以实现一个界面。

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

答案 1 :(得分:3)

你可以使用Serializable接口(在Java上)序列化和反序列化一个对象(以及一个Singleton),但不能使用静态类。

答案 2 :(得分:1)

单例实例化一次。

永远不会实例化静态类。

答案 3 :(得分:0)

GoF引用的单例的主要目的是提供多态服务,其中单例是抽象基类,具体类型在运行时决定。当然,程序中只能有一个。

答案 4 :(得分:0)

我认为原则上你所谓的单身人士与所有静态方法/成员之间没有区别。事实上,我认为创建一个包含所有静态成员的类是实现单例习语的一种方式。好吧,也许在Java中存在某种严重的差异,但我是从C ++的角度来讲。

答案 5 :(得分:0)

我认为你应该问最终类与私有构造函数和静态类之间有什么不同。 因为singleton是一个类,实现依赖于编程这个类的程序员。 它与询问对象和静态类之间的差异是一样的。

答案 6 :(得分:0)

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

答案 7 :(得分:0)

具有延迟初始化(又名Meyers单例)的单例的常见用途是控制静态对象初始化的顺序(在C ++中,在不同的转换单元中未定义)。在这方面,单身只是表现得像全球物体,但其构造顺序表现良好。

虽然控制破坏的顺序变得非常困难。如果你必须依赖于以某种特定顺序被破坏的单身人士(例如,单身人士记录等级应该超过其他单身实例),请参阅Alexandrescu的书来见证这一困难。