设计模式:单例模式

单例模式是用来保证进程中,某个类只有一个实例。因为有时候某个类很占用资源,例如:数据库连接、或者是类在构造的时候很耗费资源和时间。

单例模式的实现分为两种:饿汉式和懒汉式。前者是在静态构造函数执行时就立即实例化,后者是在程序执行过程中第一次需要时再实例化。

懒汉式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/// <summary>
    /// 懒汉式
    /// </summary>
    public class Singleton
    {
 
        private Singleton() //私有化构造函数,避免外部创建
        {
            long lResult = 0;
            for (int i = 0; i < 1000000; i++)
            {
                lResult += i;
            }
            Thread.Sleep(2000);
            Console.WriteLine($"{this.GetType().Name}被构造一次!");
        }
 
        /// <summary>
        /// 静态变量 (定义成静态变量,保障全局唯一)
        /// </summary>
        private static volatile Singleton _singleton = null; //volatile 促进线程安全
        private static object sinletonLock = new object();
 
 
        /// <summary>
        /// 公开的静态方法提供对象实例
        /// </summary>
        /// <returns></returns>
        public static Singleton CreateInstance()
        {
            //解决多线程调用时线程不在进行加锁然后进行判断。
            if (_singleton == null)
            {
                lock (sinletonLock)
                {
                    //保证只被实例化一次
                    if (_singleton == null)
                    {
                        _singleton = new Singleton();
                    }
                }
            }
             
            return _singleton;
        }
 
    }

  

懒汉式单例主要包括三部分:
1.私有化构造函数,避免外部创建。
2.公开的静态方法提供对象实例。
3. 静态变量 (定义成静态变量,保障全局唯一)。

饿汉式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Singleton
{
    private static readonly Singleton _instance;
    static Singleton()
    {
        _instance = new Singleton();
    }
 
    public static Singleton Instance
    {
        get
        {
            return _instance;
        }
    }
}

  

饿汉式是在静态构造函数中立即进行实例化。注意,为了确保单例性,需要使用 readonly 关键字声明实例不能被修改。
以上写法可简写为:

1
2
3
4
5
6
7
8
9
10
11
public class Singleton
{
    private static readonly Singleton _instance = new Singleton();
    public static Singleton Instance
    {
        get
        {
            return _instance;
        }
    }
}

  

在 C# 7 中还可以进一步简写,一句代码就搞定了,此写法如下:

1
2
3
4
public class Singleton
{
    public static Singleton Instance { get; } = new Singleton();
}

  

posted @   #谭  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤
点击右上角即可分享
微信分享提示