首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

关于C#的单例模式兑现方法

2013-06-19 
关于C#的单例模式实现方法之前使用单例模式一直定义如下:public partial class Personnel{static volatile

关于C#的单例模式实现方法
之前使用单例模式一直定义如下:


    public partial class Personnel
    {
        static volatile Personnel _instance = null;
        static readonly object Padlock = new object();
        private readonly DaoManager _daoManager = null;
        private readonly ICommonDao _commonDao = null;
        
        private Personnel()
        {
            _daoManager = ServiceConfig.GetInstance().DaoManager;
            _commonDao = _daoManager[typeof(ICommonDao)] as ICommonDao;
        }
        /// <summary>
        /// 获取单一实例
        /// </summary>
        /// <returns></returns>
        public static Personnel GetInstance()
        {
            if (_instance == null)
            {
                lock (Padlock)
                {
                    if (_instance == null)
                    {
                        _instance = new Personnel();
                    }
                }
            }
            return _instance;
        }
    }

这几天做一个项目,发现我们项目经理定义单例模式是这么做的:

    public partial class Personnel
    {
        private static Personnel _instance = new Personnel () ;
        static readonly object Padlock = new object();
        private readonly DaoManager _daoManager = null;
        private readonly ICommonDao _commonDao = null;
        
        private Personnel()
        {
            _daoManager = ServiceConfig.GetInstance().DaoManager;


            _commonDao = _daoManager[typeof(ICommonDao)] as ICommonDao;
        }
        /// <summary>
        /// 获取单一实例
        /// </summary>
        /// <returns></returns>
        public static Personnel GetInstance()
        {
            return _instance;
        }
    }


请问这两种定义单例模式的方法有没有什么差别呢? C# 单例模式 设计模式
[解决办法]
第二种好些。lazyload么必要
[解决办法]
主要是加锁的问题,并发不多的话,没有问题,否则前一种好些.
[解决办法]
第一种好。第二种就是直接定义了一个静态全局变量。
[解决办法]
如果实例化对象比较耗时/耗系统资源,或者程序运行并不一定用到的话,会采用lazy load,即第一种方式。

通常来说如果该对象总要用到或者访问次数较多,那么干脆就用第二种方式,由于这种方式省掉了判断和锁定处理,效率会高一些。
[解决办法]
第一种考虑到并发,多线程访问的问题,以前老师也推荐这么写,实际中可能并发的情况不会出现,我们开发中个个都写第二种
[解决办法]
1、安全上,一样安全。CLR在初始化类的时候,已经加锁了。所以第二种也是安全的。
2、延迟加载上,两种方法都会延迟加载。区别是:
第一种方法在第一次调用Personnel.GetInstance()的时候加载;
第二种方法在第一次用到Personnel类的时候加载。

一般来说,如果没有特殊需求,第二种方法比较流行。一是写法简单,二是不需要加锁。
[解决办法]
懒汉式与饿汉式,单例的两种实现方式

你之前那种是懒汉式
你们项目经理那种是饿汉式
[解决办法]
第一种是用不到就不会创建,比较省内存
第二种是只要调用到任何静态方法,都会创建实例
个人认为第一种好一些。
[解决办法]
第一种是Java的写法照搬过来的;
而.NET的静态是线程安全的,第二种在.NET中无任何问题

热点排行