静态类和单例模式之间存在什么实际的区别?
两者都可以在没有实例化的情况下调用,两者都只提供一个“实例”,而且都不是线程安全的。还有其他区别吗?
静态类和单例模式之间存在什么实际的区别?
两者都可以在没有实例化的情况下调用,两者都只提供一个“实例”,而且都不是线程安全的。还有其他区别吗?
当前回答
为了说明Jon的观点,如果Logger是一个静态类,下面所示的操作是无法完成的。类SomeClass希望ILogger实现的一个实例传递到其构造函数中。
Singleton类对于实现依赖注入非常重要。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
var someClass = new SomeClass(Logger.GetLogger());
}
}
public class SomeClass
{
public SomeClass(ILogger MyLogger)
{
}
}
public class Logger : ILogger
{
private static Logger _logger;
private Logger() { }
public static Logger GetLogger()
{
if (_logger==null)
{
_logger = new Logger();
}
return _logger;
}
public void Log()
{
}
}
public interface ILogger
{
void Log();
}
}
其他回答
Singleton的被实例化。只是只有一个实例被创建过,因此在Singleton中只有一个。
另一方面,静态类无法实例化。
我同意这个定义:
单词“single”表示整个应用程序生命周期中的单个对象循环,因此范围在应用程序级别。静态不具有任何Object指针,因此作用域位于AppDomain级别。此外,两者都应实现为线程安全。
你可以发现其他有趣的区别:Singleton模式与静态类
正如我所理解的,静态类和非静态Singleton类之间的区别,静态在C#中只是一个非实例化的“类型”,其中Singleton是一个真正的“对象”。换句话说,静态类中的所有静态成员都被分配给该类型,但在Singleton中,这些静态成员都位于对象之下。但请记住,静态类的行为仍然像引用类型,因为它不是Struct那样的值类型。
这意味着当你创建一个Singleton时,因为类本身不是静态的,但它的成员是静态的,所以它的优点是Singleton内部的静态成员(指的是它自己)连接到一个实际的“对象”,而不是一个空的“类型”。这就澄清了静态和非静态Singleton之间的区别,超越了它的其他特性和内存使用,这让我感到困惑。
两者都使用静态成员,它们是成员的单个副本,但Singleton将引用的成员包装在一个真正的实例化“对象”周围,该对象的地址除了静态成员之外还存在。该对象本身具有财产,其中可以传递和引用in,从而增加值。静态类只是一种类型,因此除了指向其静态成员外,它不存在。这个概念某种程度上巩固了Singleton vs Static Class超越继承和其他问题的目的。
在单例模式中,可以将单例创建为派生类型的实例,但不能使用静态类。
快速示例:
if( useD3D )
IRenderer::instance = new D3DRenderer
else
IRenderer::instance = new OpenGLRenderer
静态类示例
public class Any {
private static Any instance = new Any();
private Singleton() {
System.out.println("creating");
}
}
单例模式只存在一个实例:
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {
System.out.println("creating");
if (instance != null) {
throw new RuntimeException("Imposible create a new instance ");
}
}
}