c#用泛型实现一个单例模式基
时间: 2024-10-20 16:13:49 浏览: 5
在 C# 中,可以利用泛型和静态成员来实现一种线程安全的单例模式。这种实现称为"依赖注入式单例"(Dependency Injection Singleton),它既避免了传统单例模式的线程不安全问题,又保持了代码的灵活性。
```csharp
public abstract class SingletonBase<T> where T : new()
{
private static readonly Lazy<T> lazyInstance = new Lazy<T>(() => new T());
public static T Instance => lazyInstance.Value;
}
// 具体实例化某类型的单例
public class ConcreteSingleton : SingletonBase<ConcreteSingleton>
{
// 实现必要的业务逻辑...
}
```
在这个例子中:
1. `SingletonBase` 是一个模板类,`T` 是一个类型参数,它要求传入的类型能够通过 `new()` 构造函数创建一个新的实例。
2. `lazyInstance` 是一个 `Lazy<T>` 对象,它会在第一次请求 `Instance` 时初始化新的实例,并将其缓存起来,之后再请求就会返回相同的实例。
3. `ConcreteSingleton` 是 `SingletonBase` 的具体实现,它是其自身的实例,通过这种方式实现了单例。
相关问题
c#中如何实现泛型单例
在C#中,通常我们不会直接在单例模式中使用泛型,因为单例的特性(全局唯一、延迟加载)与泛型(允许不同类型的数据)并不完全兼容。但如果你确实需要在一个类中同时支持多种类型的实例化,一种常见的做法是在静态工厂方法中返回泛型实例。下面是一个简单的例子,展示了如何在C#中实现一个非线程安全的泛型单例类:
```csharp
public sealed class Singleton<T> where T : class
{
private static readonly Lazy<T> _instance = new Lazy<T>(() => CreateInstance());
private static T CreateInstance()
{
// 这里根据实际需求创建T类型的实例,比如通过new关键字
return Activator.CreateInstance(typeof(T));
}
public static T Instance
{
get => _instance.Value;
}
// 防止实例化
private Singleton() { }
}
// 使用示例
public class MyClass : Singleton<MyClass>
{
// 实现MyClass的业务逻辑
}
Singleton<MyClass>.Instance; // 获取MyClass的单例实例
```
注意,上述实现是线程不安全的,如果要在多线程环境下使用,你应该考虑添加适当的同步机制,如`lock`关键字或者使用`ThreadLocal`。
阅读全文