静态类和单例模式之间存在什么实际的区别?
两者都可以在没有实例化的情况下调用,两者都只提供一个“实例”,而且都不是线程安全的。还有其他区别吗?
静态类和单例模式之间存在什么实际的区别?
两者都可以在没有实例化的情况下调用,两者都只提供一个“实例”,而且都不是线程安全的。还有其他区别吗?
当前回答
在我写的一篇文章中,我描述了为什么单例比静态类好得多的观点:
静态类实际上不是规范类——它是一个包含函数和变量的命名空间由于打破了面向对象的编程原则,使用静态类不是一种好的做法静态类不能作为其他类的参数传递静态类不适合“惰性”初始化静态类的初始化和使用始终是硬跟踪的实现线程管理很困难
其他回答
Singleton的被实例化。只是只有一个实例被创建过,因此在Singleton中只有一个。
另一方面,静态类无法实例化。
在单例模式中,可以将单例创建为派生类型的实例,但不能使用静态类。
快速示例:
if( useD3D )
IRenderer::instance = new D3DRenderer
else
IRenderer::instance = new OpenGLRenderer
这是一篇好文章:http://javarevisited.blogspot.com.au/2013/03/difference-between-singleton-pattern-vs-static-class-java.html
静态类
具有所有静态方法的类。更好的性能(静态方法在编译时绑定)无法重写方法,但可以使用方法隐藏。(Java中隐藏的方法是什么?甚至JavaDoc的解释都令人困惑)公共级动物{公共静态void foo(){System.out.println(“动物”);}}公共课猫延伸动物{public static void foo(){//隐藏Animal.foo()System.out.println(“类别”);}}
辛格尔顿
只能实例化一次的对象。方法可以被重写(为什么Java不允许重写静态方法?)比静态方法更容易模拟更善于保持状态
总之,我只使用静态类来保存util方法,而使用Singleton来处理其他所有事情。
编辑
静态类也被延迟加载。谢谢@jmoreno(静态类初始化何时发生?)静态类的方法隐藏。谢谢@MaxPeng。
单例只是一个被实例化的普通类,但仅从客户端代码间接实例化一次。静态类未实例化。据我所知,静态方法(静态类必须有静态方法)比非静态方法更快。
编辑:FxCop性能规则描述:“不访问实例数据或调用实例方法的方法可以标记为静态(在VB中共享)在这样做之后,编译器将向这些成员发出非虚拟调用点,这将防止在运行时对确保当前对象指针为非空的每个调用进行检查。这可以为性能敏感的代码带来可衡量的性能增益。在某些情况下,无法访问当前对象实例表示正确性问题。"我不知道这是否也适用于静态类中的静态方法。
我们有一个连接到后端的DB框架。为了避免跨多个用户的脏读,我们使用了单例模式来确保在任何时候都有一个实例可用。
在c#中,静态类不能实现接口。当单个实例类需要实现用于业务合同或IoC目的的接口时,这就是我在没有静态类的情况下使用Singleton模式的地方
Singleton提供了一种在无状态场景中维护状态的方法
希望这对你有帮助。。