您的位置:首页 > 其它

.NET单例模式快速学习应用

2019-11-19 11:45 155 查看

单例模式属于设计模式中最简单的一个模式,在实际应用中也非常广泛,但可能是受到各类教程的影响,看到很多实现方式仍然沿用Java的那一套,其实在.NET中可以用更简洁的实现方式。

一、知识点介绍

核心目标:为了项目各处调用的都是同一个实例对象,从而实现资源共享。例如环境变量。

常见的实现方式:饿汉模式、懒汉模式、双锁模式、延迟加载模式

二、实现方式

感谢评论中@Esofar提到的延迟加载模式,确实是一个优秀的实现,在下面补上我优化过后的实现方式。

/// <summary>
/// 饿汉模式,每次都加载会造成资源浪费
/// </summary>
public class EagerSingleton
{
public static Demo Instance { get; } = new Demo();
}
/// <summary>
/// 懒汉模式,适用于没有多线程的简单应用
/// </summary>
public class LazySingleton
{
private static Demo _instance = null;
public static Demo Instance
{
get
{
if (_instance == null)
_instance = new Demo();
return _instance;
}
}
}
/// <summary>
/// 线程安全
/// </summary>
public class ThreadSafeSingleton
{
private static Demo _instance = null;
private static readonly object _lock = new object();
public static Demo Instance
{
get
{
if (_instance == null)
{
lock (_lock)
{
if (_instance == null)
_instance = new Demo();
}
}
return _instance;
}
}
}
/// <summary>
/// 延迟加载,利用静态类访问即创建的特点,兼顾易用性和线程安全的最佳实践
/// </summary>
public class DelaySingleton
{
/// <summary>
/// 内部静态类
/// </summary>
static class Nested
{
internal static readonly Demo Instance = new Demo();
}

public static Demo Instance => Nested.Instance;
}

调用方式

static void Main(string[] args)
{
ThreadPool.SetMaxThreads(25, 25);// 调整最大线程数
ThreadPool.SetMinThreads(10, 10);// 调整最小线程数

Console.WriteLine("========== 示例:饿汉模式的多线程 ==========");
Parallel.For(0, 10, (i) =>
{
Console.WriteLine($"{EagerSingleton.Instance.Id} ");
});

Console.WriteLine();
Console.WriteLine("========== 示例:懒汉模式的多线程 ==========");
Parallel.For(0, 10, (i) =>
{
Console.WriteLine($"{LazySingleton.Instance.Id} ");
});

Console.WriteLine();
Console.WriteLine("========== 示例:线程安全模式的多线程 ==========");
Parallel.For(0, 10, (i) =>
{
Console.WriteLine($"{ThreadSafeSingleton.Instance.Id} ");
});

Console.WriteLine();
Console.WriteLine("========== 示例:延迟加载模式的多线程 ==========");
Parallel.For(0, 10, (i) =>
{
Console.WriteLine($"{DelaySingleton.Instance.Id} ");
});

Console.ReadKey();
}

public class Demo
{
public string Id { get; private set; }
public Demo() { Id = Guid.NewGuid().ToString(); }
}

调用结果:

三、结论

> 饿汉模式适用于规模不大又涉及多线程的应用,但是要关注单例的对象的资源占用情况。

> 懒汉模式适用于不需要多线程的应用,容易理解记住并且效果还不错。

> 双锁模式兼顾了实用性和线程安全,在之前的系统开发中比较常见。

> 延迟加载模式,目前我看到的最佳实践,兼顾了易用性和线程安全,能理解的话可以采用这种方式。

> 单例模式不要实现 ICloneable 接口,不要涉及序列化,否则就会出现多个对象。

 四、参考资料

设计模式的征途—1.单例(Singleton)模式

C# 单例模式的五种写法

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐