聊聊如何使用单例模式

介绍

单例模式,顾名思义就是只有一个实例,并且她自己负责创建自己的对象,这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。下面我们来看下有哪几种实现方式吧。

实现方式

1、使用lock ,保证方法只有一个线程可以进入。

/// <summary>
    /// 单例类
    /// </summary>
    public class Singleton
    {
        private Singleton()
        {
            long lResult = 0;
            for (int i = 0; i < 100 - 000 - 000; i++)
            {
                lResult += i;
            }
            Thread.Sleep(2000);
            Console.WriteLine($"{this.GetType().Name}完成构造....");
        }
        private static Singleton Instance = null;
        private static readonly object Singleton_Lock = new object();
        public static Singleton CreateInstance()
        {
            if (Instance == null)
            {
                lock (Singleton_Lock)//保证方法块儿只有一个线程可以进入
                {
                    Console.WriteLine("进入lock排队....");
                    Thread.Sleep(1000);
                    if (Instance == null)
                        Instance = new Singleton();
                }
            }
            return Instance;
        }


        public static void DoNothing()
        {
            Console.WriteLine("DoNothing");
        }


        public void Show()
        {
            Console.WriteLine($"{this.GetType().Name} Show....");
        }
    }

2、使用静态构造函数,由CLR调用,在类型第一次被使用前调用,且只调用一次。

/// <summary>
    /// 单例类
    /// </summary>
    public class SingletonSecond
    {
        private SingletonSecond()
        {
            long lResult = 0;
            for (int i = 0; i < 100 - 000 - 000; i++)
            {
                lResult += i;
            }
            Thread.Sleep(2000);
            Console.WriteLine($"{this.GetType().Name}完成构造....");
        }
        private static SingletonSecond Instance = null;
        /// <summary>
        /// 静态构造函数,由CLR调用,在类型第一次被使用前调用,且只调用一次!
        /// </summary>
        static SingletonSecond()
        {
            Instance = new SingletonSecond();
        }
        public static SingletonSecond CreateInstance()
        {
            
            return Instance;
        }


        public static void DoNothing()
        {
            Console.WriteLine("DoNothing");
        }


        public void Show()
        {
            Console.WriteLine($"{this.GetType().Name} Show....");
        }
    }

3、使用静态字段,由CLR调用,在类型第一次被使用前初始化,且只初始化一次。

/// <summary>
    /// 单例类
    /// </summary>
    public class SingletonThird
    {
        private SingletonThird()
        {
            long lResult = 0;
            for (int i = 0; i < 100 - 000 - 000; i++)
            {
                lResult += i;
            }
            Thread.Sleep(2000);
            Console.WriteLine($"{this.GetType().Name}完成构造....");
        }
        /// <summary>
        /// 静态字段,由CLR调用,在类型第一次被使用前初始化,且只初始化一次!
        /// </summary>
        private static SingletonThird Instance = new SingletonThird();
       
        public static SingletonThird CreateInstance()
        {
            
            return Instance;
        }


        public static void DoNothing()
        {
            Console.WriteLine("DoNothing");
        }


        public int iNum = 0;
        public void Show()
        {
            Console.WriteLine($"{this.GetType().Name} Show..{iNum++}..");
        }


        public void Add()
        {
            this.iNum++;
        }
    }

使用场景

1、需要生成唯一序列的环境。

2、需要频繁实例化然后销毁的对象。

3、创建对象时耗时过多或者耗资源过多,但又经常用到的对象。 

4、方便资源相互通信的环境。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值