设计模式-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中的任务管理器、回收站。这些功能均需要保证只有一个实际的存在。

你可能感兴趣的:(设计模式,设计模式,单例)