您现在的位置是:主页>文章>C# 设计模式(4)--单例模式 网站首页

C# 设计模式(4)--单例模式

一,引言

这个系列是本人对设计模式的一些看法,希望能让对设计模式有兴趣的朋友,以此入门,写的不当之处欢迎指出。转载的朋友请留下原文链接。下面为大家介绍一种设计模式——单例模式(Singleton).

二,定义

确保一个类仅有一个实例,并且提供一个访问它的全局访问点。

三,具体实例

单线程模式

 public sealed class Singleton
    {
        /// 
        /// 单例类
        /// 
        private static Singleton _instance = null;

        private Singleton()
        {
        }

        /// 
        /// Gets the instance.
        /// 
        public static Singleton Instance
        {           
            get { return _instance ?? (_instance = new Singleton()); }
            //??用来获取如果为空的默认值
        }
    }

分析以上实例,1:有一个私有的无参数构造函数,防止其它类实例化它,而且单例类也应该是密封的不能被继承的否则就和定义相违背。2:一个静态的变量应该保存实例的引用。3:一个公有的静态方法用来获取单实例的引用,如果实例为null即创建一个。

以上例子在单线程模式下没有任何问题,但是在多线程中就有可能存在两个线程同时判断_instance是不是为空的,且创建了两个实例,这就违背了单例模式的意图了。

解决方法:lock()

多线程模式

 public sealed class Singleton
    {
        private static Singleton _instance = null;
        private static readonly object SynObject = new object();

        Singleton()
        {
        }

        /// 
        /// Gets the instance.
        /// 
        public static Singleton Instance
        {
            get
            {
                if (_instance == null)
                {
                    lock (SynObject)
                    {
                        return _instance ?? (_instance = new Singleton());
                    }
                }
                return _instance;
            }
        }
    }

通过lock加锁防止同步操作,lock括号里的值只能是引用类型的值,上例使用object辅助完成加锁。而且lock语句是非常消耗性能的所以在之上又加了一层检查,提高性能。

四,为何要使用单例模式

控制实例的唯一性的时候。

注意:不要滥用单例模式,在一定程度上限制了程序的可扩展性。

看...,单例模式也就那么回事,喜欢请转载。


本例实例下载:单例模式源码

Top