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

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


当前回答

静态类通常用于库,如果我只需要特定类的一个实例,则使用单实例。但是,从内存的角度来看,存在一些差异:通常在堆中只分配对象,分配的唯一方法是当前正在运行的方法。静态类的所有方法都是静态的,从一开始就在堆中,所以通常静态类会消耗更多的内存。

其他回答

我同意这个定义:

单词“single”表示整个应用程序生命周期中的单个对象循环,因此范围在应用程序级别。静态不具有任何Object指针,因此作用域位于AppDomain级别。此外,两者都应实现为线程安全。

你可以发现其他有趣的区别:Singleton模式与静态类

一个显著的区别是Singleton附带的不同实例化。

对于静态类,它由CLR创建,我们无法控制它。使用singleton,对象在尝试访问的第一个实例上实例化。

单例只不过是一个类上的一次写入静态变量,一旦初始化,它总是引用自身的同一实例。

因此,您不能“使用单例代替静态变量”,也不能通过使用单例避免静态变量中的状态。

单例的优点只有一点:即使其他代码尝试重新初始化它一千次,它也不会被重新初始化。这对于像网络处理程序这样的东西来说非常棒,如果一个实例在等待响应的过程中被另一个实例替换,它会很糟糕。

除非你想要一个没有任何装置的整个应用程序,所有地方都是静态的-那么单例对于这些情况是有意义的,因为我们不能依靠缺少人为错误作为唯一的保证不会覆盖某些内容。

但要注意,单身汉并不能保证不会在任何地方生活。你的网络处理程序本身也可能依赖于其他单身者,等等。。。了不起的

而且,目前还没有编译器可以确保在编译时,单例是所有状态所在的地方,或者任何其他这样的想法所在的地方。在具有单例的类上可以有一百个静态变量。单例可以访问静态变量。编译器不会在意。

因此,我要提醒任何人,不要假设使用单例可以保证任何有关州生活的信息。它唯一的保证就是它是其类的唯一实例。这也是它唯一的优势。

其他答案所声称的单线图的任何其他优点都是编译器无法保证的,并且可能因语言而异。依赖注入是一种可能依赖于单例的补充模式,尽管它可能是或可能不是给定语言中的最佳解决方案或唯一解决方案。在缺少泛型的语言中,或者在调用静态访问器和函数时设置了任意限制,诉诸单例模式可能确实是解决给定问题的最佳解决方案。

在Swift这样的语言中,Singleton根本不需要获得依赖注入、可测试代码、良好管理的状态、线程安全访问器、多态性等。然而,它对于保证单一实例仍然有用。

概括一下:单例不过是一个静态变量,它可以防止给定类的多个实例存在,并防止单个实例被新实例覆盖。就这样,句号,句号。

Java中的静态类只有静态方法。这是一个集装箱功能。它是基于程序编程设计创建的。

Singleton类是面向对象设计中的一种模式。单身汉类在JVM中只有一个对象实例。这种模式是以始终只有一个实例的方式实现JVM中存在的类。

正如我所理解的,静态类和非静态Singleton类之间的区别,静态在C#中只是一个非实例化的“类型”,其中Singleton是一个真正的“对象”。换句话说,静态类中的所有静态成员都被分配给该类型,但在Singleton中,这些静态成员都位于对象之下。但请记住,静态类的行为仍然像引用类型,因为它不是Struct那样的值类型。

这意味着当你创建一个Singleton时,因为类本身不是静态的,但它的成员是静态的,所以它的优点是Singleton内部的静态成员(指的是它自己)连接到一个实际的“对象”,而不是一个空的“类型”。这就澄清了静态和非静态Singleton之间的区别,超越了它的其他特性和内存使用,这让我感到困惑。

两者都使用静态成员,它们是成员的单个副本,但Singleton将引用的成员包装在一个真正的实例化“对象”周围,该对象的地址除了静态成员之外还存在。该对象本身具有财产,其中可以传递和引用in,从而增加值。静态类只是一种类型,因此除了指向其静态成员外,它不存在。这个概念某种程度上巩固了Singleton vs Static Class超越继承和其他问题的目的。