`Singleton<>`是如何实现的?
时间: 2024-10-04 14:02:43 浏览: 0
`Singleton`设计模式是一种常用的软件设计模式,用于确保一个类只有一个实例存在并提供全局访问点。在C#中,通常通过几种方式实现:
1. **静态工厂方法**:
可以在类内部定义一个私有静态实例变量和一个静态工厂方法。例如:
```csharp
private static readonly InventoryManager _instance;
public static InventoryManager Instance => _instance ?? (_instance = new InventoryManager());
```
这样每次请求`Instance`都会检查是否有实例,如果没有就创建一个新的。
2. **构造函数限制**:
将构造函数设为私有,然后添加一个公共静态方法返回实例,确保只允许在特定条件下创建实例:
```csharp
private InventoryManager() {}
public static InventoryManager GetInstance() {
if (_instance == null) {
lock (typeof(InventoryManager)) {
if (_instance == null) {
_instance = new InventoryManager();
}
}
}
return _instance;
}
```
使用`lock`关键字防止并发实例创建。
3. **使用`Lazy<T>`**:
C# 5.0 引入了`Lazy<T>`类,可以简化延迟加载的单例实现:
```csharp
public sealed class InventoryManager : Singleton<InventoryManager>
{
private readonly Lazy<InventoryManager> lazy = new Lazy<InventoryManager>(() => this);
private InventoryManager() {}
public static InventoryManager Instance => lazy.Value;
}
```
这样当首次请求时才会创建实例。
每种方法都有其优缺点,选择哪种取决于具体的应用场景和需求。注意,过度依赖单例可能导致代码难以测试和维护,因此应该谨慎使用。