设计模式-2、单例模式

单例模式,也是非常好理解的一种设计模式。
单例,也叫单件,目的是为了保证一个类只有一个实例。当然,没使用上单例模式的时候,在代码实现时候,注意不要随便new某个对象,这…..的确可以,但很不安全。因此简单代码一处理,一个单例模式便出来了。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _2_单例模式
{

    public class SingletonInfo
    {
        private static SingletonInfo info = null;
        private SingletonInfo() { }

        public static SingletonInfo GetInfo()
        {
            if (null == info)
            {
                info = new SingletonInfo();
            }
            return info;
        }

    }

    class Program
    {
        static void Main(string[] args)
        {
            // SingletonInfo info = new SingletonInfo();因为构造函数是私有的,所以编译器不给new
            SingletonInfo info = SingletonInfo.GetInfo();//这样就能基本保证SingletonInfo类只有一个实例,前提是没有多线程
        }
    }
}

上边的写法叫做懒汉模式,所谓懒,就是没到用它的那天,它都不肯生成个实际出来,以节约资源。然而还有另外一种差不多的写法,叫饿汉模式,则系统始终阶段它便有那么一个实际。实际上就只稍做改变

    public class EagerSingletonInfo
    {
        private static EagerSingletonInfo info = new EagerSingletonInfo();//它 的静态实例,始终阶段就new出来了
        private EagerSingletonInfo() { }

        public static EagerSingletonInfo GetInfo()
        {
            return info;
        }

    }

另外,第一段代码中还提及到所写的单例只针对没有多线程的情况,面对多线程,有较小的概率还是会不安全的。

        public static SingletonInfo GetInfo()
        {
            if (null == info)
            {//如果两个或以上的线程同时跑到这里来,就不止得一个实例了
                info = new SingletonInfo();
            }
            return info;
        }

解决起来也无非加锁,做法常规则,只不过lock在开发中的不多用。

    public class SingletonInfo
    {
        private static SingletonInfo info = null;
        private static object objHelpless = new object();//制造个没实际作用的对象出来,只为加锁
        private SingletonInfo() { }

        public static SingletonInfo GetInfo()
        {
            if (null == info)//先不加锁判断下,如果它本身非空,每次都锁着判断,性能会下降了点
            {
                lock (objHelpless)
                {
                    if (null==info)//这时候带锁判断,安全可靠
                    {
                        info = new SingletonInfo();
                    }
                }
            }
            return info;
        }

    }

现实中,用到单例模式的地方也不少,例如:web中的application、windows中的任务管理器、回收站。这些功能均需要保证只有一个实际的存在。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值