静态类和单例模式之间存在什么实际的区别?
两者都可以在没有实例化的情况下调用,两者都只提供一个“实例”,而且都不是线程安全的。还有其他区别吗?
静态类和单例模式之间存在什么实际的区别?
两者都可以在没有实例化的情况下调用,两者都只提供一个“实例”,而且都不是线程安全的。还有其他区别吗?
当前回答
我们有一个连接到后端的DB框架。为了避免跨多个用户的脏读,我们使用了单例模式来确保在任何时候都有一个实例可用。
在c#中,静态类不能实现接口。当单个实例类需要实现用于业务合同或IoC目的的接口时,这就是我在没有静态类的情况下使用Singleton模式的地方
Singleton提供了一种在无状态场景中维护状态的方法
希望这对你有帮助。。
其他回答
我头脑中的不同是实现面向对象编程(Singleton/Prototype)或函数编程(Static)。
我们过于关注单例模式创建的对象数量,而我们应该关注的是最终我们持有一个对象。正如其他人已经说过的,它可以扩展,作为参数传递,但最重要的是它是状态满的。
另一方面,静态用于实现函数式编程。静态成员属于一个类。他们是无国籍的。
顺便问一下,您是否知道可以创建单例静态类:)
延迟加载支持接口,以便提供单独的实现能够返回派生类型(作为lazyloading和接口实现的组合)
一个显著的区别是Singleton附带的不同实例化。
对于静态类,它由CLR创建,我们无法控制它。使用singleton,对象在尝试访问的第一个实例上实例化。
与静态类的区别
JDK有单例和静态的例子,一方面java.lang.Math是带有静态方法的最终类,另一方面java.lang.Runtime是单例类。
单例的优点
如果您需要维护状态,那么单例模式比静态类更好,因为在静态类中维护状态会导致错误,特别是在并发环境中,如果没有多个线程进行适当的同步并行修改,则可能会导致竞争条件。如果Singleton类是一个沉重的对象,那么它可以被延迟加载,但静态类没有这样的优势,总是急切地加载。使用singleton,您可以使用继承和多态性来扩展基类、实现接口并提供不同的实现。由于Java中的静态方法不能被重写,它们会导致灵活性。另一方面,您可以通过扩展singleton类来重写它中定义的方法。
静态类的缺点
为单例编写单元测试比静态类更容易,因为只要需要单例,就可以传递模拟对象。
静态类的优点
静态类提供了比单例更好的性能,因为静态方法是在编译时绑定的。
单例模式有几种实现方式,每种实现方式都有优缺点。
Eager加载单例双重检查锁定单例按需初始化持有者习惯用法基于枚举的单例
详细描述每一个都太冗长了,所以我只需要链接到一篇好文章-你想知道的关于Singleton的所有信息
我不是一个伟大的OO理论家,但据我所知,我认为与Singleton相比,静态类唯一缺少的OO特性是多态性。但如果您不需要它,那么使用静态类,您当然可以继承(不确定接口实现)以及数据和函数封装。
Morendil的评论,“静态类中体现的设计风格纯粹是程序性的”我可能是错的,但我不同意。在静态方法中,您可以访问静态成员,这与单例方法访问其单个实例成员完全相同。
编辑:我现在实际上在想,另一个区别是,静态类在程序开始时被实例化,并且在整个程序的生命周期中都存在,而单例在某个时刻被显式实例化,也可以被销毁。
*或者它可能在第一次使用时被实例化,这取决于语言,我认为。