静态类和单例模式之间存在什么实际的区别?
两者都可以在没有实例化的情况下调用,两者都只提供一个“实例”,而且都不是线程安全的。还有其他区别吗?
静态类和单例模式之间存在什么实际的区别?
两者都可以在没有实例化的情况下调用,两者都只提供一个“实例”,而且都不是线程安全的。还有其他区别吗?
当前回答
正如我所理解的,静态类和非静态Singleton类之间的区别,静态在C#中只是一个非实例化的“类型”,其中Singleton是一个真正的“对象”。换句话说,静态类中的所有静态成员都被分配给该类型,但在Singleton中,这些静态成员都位于对象之下。但请记住,静态类的行为仍然像引用类型,因为它不是Struct那样的值类型。
这意味着当你创建一个Singleton时,因为类本身不是静态的,但它的成员是静态的,所以它的优点是Singleton内部的静态成员(指的是它自己)连接到一个实际的“对象”,而不是一个空的“类型”。这就澄清了静态和非静态Singleton之间的区别,超越了它的其他特性和内存使用,这让我感到困惑。
两者都使用静态成员,它们是成员的单个副本,但Singleton将引用的成员包装在一个真正的实例化“对象”周围,该对象的地址除了静态成员之外还存在。该对象本身具有财产,其中可以传递和引用in,从而增加值。静态类只是一种类型,因此除了指向其静态成员外,它不存在。这个概念某种程度上巩固了Singleton vs Static Class超越继承和其他问题的目的。
其他回答
单例的另一个优点是它可以很容易地序列化,如果您需要将其状态保存到磁盘或远程发送到某个位置,这可能是必要的。
从客户端的角度来看,静态行为对客户端来说是已知的,但是Singleton行为可以对客户端隐藏完成。客户可能永远不会知道,他一次又一次地玩弄着一个实例。
我将努力超越WTMI和WTL;DR响应。
单身者是一个物体的实例。。。句点
你的问题基本上是问类和该类的实例之间的区别。我认为这很清楚,不需要详细说明。
singleton的类通常采取步骤来确保构建一个实例;这很聪明,但不是必须的。
示例:var connection=connection.Instance;
假设这是Connection类:
public sealed class Connection
{
static readonly Connection _instance = new Connection();
private Connection()
{
}
public static Connection Instance
{
get
{
return _instance;
}
}
}
请注意,您可以在该类上抛出一个接口并模拟它以进行测试,这是静态类无法轻易做到的。
我头脑中的不同是实现面向对象编程(Singleton/Prototype)或函数编程(Static)。
我们过于关注单例模式创建的对象数量,而我们应该关注的是最终我们持有一个对象。正如其他人已经说过的,它可以扩展,作为参数传递,但最重要的是它是状态满的。
另一方面,静态用于实现函数式编程。静态成员属于一个类。他们是无国籍的。
顺便问一下,您是否知道可以创建单例静态类:)
这是一篇好文章: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。