静态类和单例模式之间存在什么实际的区别?

两者都可以在没有实例化的情况下调用,两者都只提供一个“实例”,而且都不是线程安全的。还有其他区别吗?


当前回答

下面是静态类和单例之间的一些主要区别:

1.Singleton是一种模式,而不是像static那样的关键字。因此,对于创建静态类,静态关键字就足够了,而对于单例,则需要为单例编写逻辑。

2.单例类必须具有私有的默认实例构造函数,而静态类不能包含任何实例构造函数。

3.静态类既不实例化也不扩展,而单例类可以实例化。

4.静态类是隐式密封的,但单例类必须修饰为显式密封的。

5.单例可以实现接口或从另一个类继承,但静态类既不实现接口,也不从任何其他类扩展。

6.我们不能用静态类实现依赖注入,但单例类可以实现DI,因为它可以是接口驱动的。静态类的作用域位于应用程序域级别,因为它由CLR管理,而单例对象的作用域则跨越应用程序生命周期。

7.静态类不能有任何析构函数,但单例类可以定义析构函数。

8.单例类实例可以作为参数传递给另一个方法,而静态类不能传递,因为它只包含静态成员。

其他回答

单例的另一个优点是它可以很容易地序列化,如果您需要将其状态保存到磁盘或远程发送到某个位置,这可能是必要的。

真正的答案是Jon Skeet在这里的另一个论坛上给出的。

单例允许访问单个已创建实例-该实例(或而是对该实例的引用)可以作为参数传递给其他方法,并视为正常对象静态类只允许静态方法。

是什么让你说单例或静态方法都不是线程安全的?通常,这两者都应该实现为线程安全的。

单例和一堆静态方法之间的最大区别是,单例可以实现接口(或从有用的基类派生,尽管在我的经验中这不太常见),因此您可以将单例作为“另一个”实现来传递。

我不是一个伟大的OO理论家,但据我所知,我认为与Singleton相比,静态类唯一缺少的OO特性是多态性。但如果您不需要它,那么使用静态类,您当然可以继承(不确定接口实现)以及数据和函数封装。

Morendil的评论,“静态类中体现的设计风格纯粹是程序性的”我可能是错的,但我不同意。在静态方法中,您可以访问静态成员,这与单例方法访问其单个实例成员完全相同。

编辑:我现在实际上在想,另一个区别是,静态类在程序开始时被实例化,并且在整个程序的生命周期中都存在,而单例在某个时刻被显式实例化,也可以被销毁。

*或者它可能在第一次使用时被实例化,这取决于语言,我认为。

Singleton的一个主要优势:多态性例如:使用Class工厂创建实例(比如基于某些配置),我们希望这个对象是真正的单实例。