单例模式案例

案例:

1.懒汉模式

  class NormalCase
     {
        public string Name { get; set; }

        //第一步:构造函数私有化: 外界不能用new 进行实例
        private NormalCase() { }

        //第二步:自行创建一个空实例 static代表只能创建一个实例
        private static NormalCase normalCase=null;//赖汉模式

        //第三步:提供外界可访问实例的方法
        public static NormalCase getInstance()
        {
            //存在安全:多线程并发:会产生多个实例
            if (normalCase==null)
            {
                normalCase = new NormalCase();
            }
            return normalCase;
        }

        public void ShowMsg()
        {
            Console.WriteLine(Name);
        }
    }

2.普通类改为单利模式

class NormalCase
    {
        public string Name { get; set; }

        //第一步:构造函数私有化: 外界不能用new 进行实例
        private NormalCase() { }

        //第二步:自行创建一个实例 static代表只能创建一个实例
        private static NormalCase normalCase = new NormalCase();//饿汉模式

        //第三步:提供外界可访问实例的方法
        public static NormalCase getInstance()
        {
            return normalCase;
        }

        public void ShowMsg()
        {
            Console.WriteLine(Name);
        }
    }

3.内部静态类实现双重验证

class NormalCase
    {
        public string Name { get; set; }

        //第一步:构造函数私有化: 外界不能用new 进行实例
        private NormalCase() { }

        //第二步:内部静态类
        private static class NormalCaseHelper
        {
            public static NormalCase normalCase = new NormalCase();
        }

        //第三步:提供外界可访问实例的方法
        public static NormalCase getInstance()
        {
            return NormalCaseHelper.normalCase;
        }

        public void ShowMsg()
        {
            Console.WriteLine(Name);
        }
    }

4.双重验证

class NormalCase
    {
        //定义一个锁资源
        private static readonly Object obj = new object();
        public string Name { get; set; }
        //第一步:构造函数私有化: 外界不能用new 进行实例
        private NormalCase() { }

        //第二步:自行创建一个空实例 static代表只能创建一个实例
        private static NormalCase normalCase=null;//赖汉模式

        //第三步:提供外界可访问实例的方法
        public static NormalCase getInstance()
        {
            //一重验证
            if (normalCase==null)
            {
                lock(obj)
                {
                    //二重验证
                    if (normalCase == null)
                    {
                        normalCase = new NormalCase();
                    }
                }              
            }
            return normalCase;
        }
        public void ShowMsg()
        {
            Console.WriteLine(Name);
        }
    }

5.控制台输出

class Program
    {
        static void Main(string[] args)
        {
            NormalCase nc = NormalCase.getInstance();
            nc.Name = "Jack";
            nc.ShowMsg();

            NormalCase nc1 = NormalCase.getInstance();
            nc1.ShowMsg();

            Console.Read();
        }
    }

         

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值