C#设计模式之单例模式的实现方式
什么是单例模式
单例模式是设计模式的一种,它保证在整个应用程序生命周期中只能有一个实例被创建和访问,并且这个实例是全局唯一的。在需要频繁创建和销毁对象时,单例模式可以提高程序的性能和可维护性。
单例模式的实现方式
在 C# 中,单例模式有多种实现方式,如下:
第一种:懒汉式单例模式
使用懒汉式单例模式,在第一次调用 GetInstance()
方法时创建单例对象。如果多个线程同时调用 GetInstance()
方法,可能会出现多个实例的情况,因此需要进行线程同步。
public class LazySingleton
{
private static Lazy<LazySingleton> instance = new Lazy<LazySingleton>(() => new LazySingleton());
private LazySingleton() { }
public static LazySingleton GetInstance()
{
return instance.Value;
}
}
第二种:饿汉式单例模式
使用饿汉式单例模式,就可以确保只有一个实例对象被创建和访问,在加载时就创建了单例对象。
public class EagerSingleton
{
private static readonly EagerSingleton instance = new EagerSingleton();
private EagerSingleton() { }
public static EagerSingleton GetInstance()
{
return instance;
}
}
单例模式的示例说明
示例1:单线程环境下的单例模式
在单线程环境下的单例模式实现比较简单,只需使用饿汉式单例模式即可。
class Program
{
static void Main(string[] args)
{
// 饿汉式单例模式
var instance1 = EagerSingleton.GetInstance();
var instance2 = EagerSingleton.GetInstance();
if (instance1 == instance2)
Console.WriteLine("EagerSingleton works");
else
Console.WriteLine("EagerSingleton fails");
Console.ReadKey();
}
}
输出结果:
EagerSingleton works
示例2:多线程环境下的单例模式
在多线程环境下的单例模式实现需要考虑线程安全的问题,可以使用双重检查锁进行优化。
class Program
{
static void Main(string[] args)
{
// 懒汉式单例模式
var tasks = new List<Task<LazySingleton>>();
for (int i = 0; i < 10; i++)
{
tasks.Add(Task.Run(() =>
{
return LazySingleton.GetInstance();
}));
}
Task.WaitAll(tasks.ToArray());
var instances = tasks.Select(t => t.Result);
if (instances.Distinct().Count() == 1)
Console.WriteLine("LazySingleton works");
else
Console.WriteLine("LazySingleton fails");
Console.ReadKey();
}
}
输出结果:
LazySingleton works
在示例2中,我们创建了 10 个异步任务同时获取 LazySingleton
的实例,如果单例模式实现正确,那么所有的实例应该是相等的。如果代码实现有问题,则会出现多个实例的情况。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c#设计模式之单例模式的实现方式 - Python技术站