静态类和单例模式之间存在什么实际的区别?
两者都可以在没有实例化的情况下调用,两者都只提供一个“实例”,而且都不是线程安全的。还有其他区别吗?
静态类和单例模式之间存在什么实际的区别?
两者都可以在没有实例化的情况下调用,两者都只提供一个“实例”,而且都不是线程安全的。还有其他区别吗?
当前回答
Singleton类在应用程序生命周期期间提供一个对象(仅一个实例),例如java.lang.Runtime而静态类只提供静态方法,如java.lang.MathJava中的静态方法不能被重写,但Singleton类中定义的方法可以通过扩展来重写。Singleton类能够继承和多态性来扩展基类、实现接口并能够提供不同的实现。而不是静态的。
例如:java.lang.Runtime是java中的Singleton类,调用getRuntime()方法返回与当前java应用程序关联的运行时对象,但确保每个JVM只有一个实例。
其他回答
在我写的一篇文章中,我描述了为什么单例比静态类好得多的观点:
静态类实际上不是规范类——它是一个包含函数和变量的命名空间由于打破了面向对象的编程原则,使用静态类不是一种好的做法静态类不能作为其他类的参数传递静态类不适合“惰性”初始化静态类的初始化和使用始终是硬跟踪的实现线程管理很困难
从客户端的角度来看,静态行为对客户端来说是已知的,但是Singleton行为可以对客户端隐藏完成。客户可能永远不会知道,他一次又一次地玩弄着一个实例。
我们可以创建单例类的对象并将其传递给方法。Singleton类对继承没有任何限制。我们不能处理静态类的对象,但可以处理单例类。
静态类别:-
无法创建静态类的实例。当加载包含类的程序或命名空间时,由.NET Framework公共语言运行库(CLR)自动加载。我们不能将静态类传递给方法。我们不能将静态类继承到C#中的另一个静态类。具有所有静态方法的类。更好的性能(静态方法在编译时绑定)
辛格尔顿:-
您可以创建对象的一个实例并重用它。当用户请求时,首次创建Singleton实例。您可以创建singleton类的对象并将其传递给方法。Singleton类没有说明继承的任何限制。我们可以处理单例类的对象,但不能处理静态类的对象。方法可以被重写。可以在需要时延迟加载(静态类总是加载的)。我们可以实现接口(静态类不能实现接口)。
静态类是一个只有静态方法的类,对于这个类,更好的词是“函数”。静态类中体现的设计风格纯粹是过程性的。
另一方面,Singleton是OO设计特有的模式。它是一个对象的实例(具有其中固有的所有可能性,例如多态性),具有一个创建过程,确保在整个生命周期中只有一个特定角色的实例。