• Singleton 模式


    老樊,你这次去山西出差得多久啊?”小刘在电话那头说。

    “呃……这回我过来手头上兼着三个项目,估计得有段时间啊!你不知道来山西这几天我有多累啊,写文档写到手都要抽筋了!”

    “那你可得注意休息啊,上次你给我说的那两个设计模式我已经很熟练了,你啥时候教我新的设计模式啊?”

    “这样吧,等我把手头上的这个需求分析写完,我就给你电话。”

    写文档时间过得很快,一转眼就到深夜了。

    酒店很安静,但是我的思绪却清晰不起来,用户需求中有一部分始终不能很好的理解,也许是想了一天,大脑零件也该断电休息休息了。

    躺在床上怎么也睡不着,老觉得有件事情还没做,仔细想想才记起今天答应给小刘讲设计模式了。

    发条短信过去试探试探看看她睡没,“小刘,你睡了没”。

    很快就收到了回复,这家伙还没睡啊。

    “还没呢,一直在等你电话呢,我可不象某人说话不算话啊!”

    赶紧拨通了电话。

    “呃……小刘,不好意思啊,忙晕头了!”

    “嗯!没事,今天咱们讲什么设计模式啊?”

    “今天这么晚了,就讲一个简单的设计模式-单件模式吧!”

    “嗯!这个我明白,这个模式的意思就是保证一个对象的唯一性吧!”

    “对,单件模式就是保证一个对象独一无二,就象你身上的器官一样,都是独一无二的,别人肯定没有小刘的左眼或者小刘的右眼吧!”

    “嗯,这个模式很好理解!”

    “一会我把例子写出来给你发过去,你早点休息吧!”

    “好的,你要是累了就早点休息,明天再给我也是一样!ByeBye!”

    单件模式UML图:

    image

    instance:Singlegon的实例。

    Singleton():私有的构造函数。

    GetSinglegon():返回Singleton对象instance。

    单例模式代码:

    LiuRightHand.cs
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace SingletonPattern
    {
        ///<summary>/// 小刘右手
        ///</summary>publicclass LiuRightHand
        {
            //私有静态小刘右手对象privatestatic LiuRightHand instance =null;
    
            //私有构造函数private LiuRightHand()
            {
            }
    
            //公用属性,获得小刘右手对象publicstatic LiuRightHand GetRightHand()
            {
                if (instance ==null)
                {
                    instance =new LiuRightHand();
                }
                return instance;
            }
        }
    }
     
    
     
    
    这样并不能保证该类的唯一性,在多线程程序中可能会产生多个小刘右手实例,这样小刘不就成了多臂怪啦。
    
    因此需要解决多线程下可能产生多个实例的问题:
    
     
    
    LiuLeftHand.cs
    
     
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace SingletonPattern
    {
        ///<summary>/// 小刘左手
        ///</summary>publicclass LiuLeftHand
        {
            //私有静态小刘左手对象privatestatic LiuLeftHand instance =null;
            publicstaticreadonlyobject handLock =newobject();
    
            //私有构造函数private LiuLeftHand()
            {
            }
    
            //公用方法,获得小刘左手对象publicstatic LiuLeftHand GetLeftHand()
            {
                lock (handLock)
                {
                    if (instance ==null)
                    {
                        instance =new LiuLeftHand();
                    }
                    return instance;
                }
            }
        }
    }
     
    
     
    
    在一个线程使用该对象时,lock方法将会锁住代码,另一个线程如果要使用该对象,会一直等待,直到前一个线程使用完。
    
     
    
    我们还可以对代码进行优化。
    
    双重锁定:
    
    LiuRightFoot.cs
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace SingletonPattern
    {
        ///<summary>/// 小刘右脚
        ///</summary>publicclass LiuRightFoot
        {
            //私有静态小刘右脚对象privatestatic LiuRightFoot instance =null;
            publicstaticreadonlyobject footLock =newobject();
    
            //私有构造函数private LiuRightFoot()
            {
            }
    
            //公用属性,获得小刘右脚对象publicstatic LiuRightFoot GetRightHand()
            {
                if (instance ==null)
                {
                    lock (footLock)
                    {
                        if (instance ==null)
                        {
                            instance =new LiuRightFoot();
                        }
                    }
                }
                return instance;
            }
        }
    }
     
    
    静态初始化:
    
    LiuLeftFoot.cs
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace SingletonPattern
    {
        ///<summary>/// 小刘左脚
        ///</summary>publicsealedclass LiuLeftFoot
        {
            //私有静态小刘左脚对象privatestaticreadonly LiuLeftFoot instance =new LiuLeftFoot();
    
            //私有构造函数private LiuLeftFoot()
            {
            }
    
            //公用方法,获得小刘左脚对象publicstatic LiuLeftFoot GetLeftHand()
            {
                return instance;
            }
        }
    }


    下面是从书上看到的强烈推存的解法:利用构造函数
    c#的语法中有一个函数能够确保只调用一次,那就是静态构造函数,我们可以利用c#这个特性实现singleton模式如下:
    public
    sealed class Singleton { private Singleton() { } private static Singleton instance=new Singleton(); public static Singleton Instance
    {
    get { return instance; } } }
    
    
    
    
    
  • 相关阅读:
    轮播制作
    前端问题总结
    响应式 媒体查询 盒模型
    响应式 字体设置 flex 弹性布局
    C++ STL之set常用指令
    SRM468
    SRM470
    置换及其应用专题
    C++ STL之map常用指令
    C++ STL之pair常用指令
  • 原文地址:https://www.cnblogs.com/lyunyu/p/3017303.html
Copyright © 2020-2023  润新知