单例模式
Singleton 模式旨在将类的创建限制为一个实例。
这种模式用于只有一个东西才有意义的场景,例如:
- 一个编排其他对象交互的单一类,例如。经理类
- 或者一个代表唯一的单一资源的类,例如记录组件
实现 Singleton 模式的最常见方法之一是通过静态**工厂方法,**例如 CreateInstance()
或 GetInstance()
(或 C#中的静态属性,Instance
),然后将其设计为始终返回相同的实例。
对方法或属性的第一次调用创建并返回 Singleton 实例。此后,该方法始终返回相同的实例。这样,只有一个单例对象的实例。
防止通过 new
创建实例可以通过使类构造函数 private.
来实现
以下是在 C#中实现 Singleton 模式的典型代码示例:
class Singleton
{
// Because the _instance member is made private, the only way to get the single
// instance is via the static Instance property below. This can also be similarly
// achieved with a GetInstance() method instead of the property.
private static Singleton _instance = null;
// Making the constructor private prevents other instances from being
// created via something like Singleton s = new Singleton(), protecting
// against unintentional misuse.
private Singleton()
{
}
public static Singleton Instance
{
get
{
// The first call will create the one and only instance.
if (_instance == null)
{
_instance = new Singleton();
}
// Every call afterwards will return the single instance created above.
return _instance;
}
}
}
为了进一步说明这种模式,下面的代码检查在多次调用 Instance 属性时是否返回相同的 Singleton 实例。
class Program
{
static void Main(string[] args)
{
Singleton s1 = Singleton.Instance;
Singleton s2 = Singleton.Instance;
// Both Singleton objects above should now reference the same Singleton instance.
if (Object.ReferenceEquals(s1, s2))
{
Console.WriteLine("Singleton is working");
}
else
{
// Otherwise, the Singleton Instance property is returning something
// other than the unique, single instance when called.
Console.WriteLine("Singleton is broken");
}
}
}
注意:此实现不是线程安全的。
要查看更多示例,包括如何使此线程安全,请访问: Singleton Implementation
单例在概念上类似于全局价值,并导致类似的设计缺陷和担忧。因此,Singleton 模式被广泛认为是反模式。
访问 “单例有什么坏处?” 有关使用它们时出现的问题的更多信息。
在 C#中,你可以创建一个类 static
,它使所有成员都是静态的,并且无法实例化该类。鉴于此,通常会看到使用静态类代替 Singleton 模式。
有关两者之间的主要区别,请访问 C#Singleton Pattern 与 Static Class 。