读书人

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

发布时间: 2013-06-19 10:26:41 作者: rapoo

关于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中无任何问题

读书人网 >C#

热点推荐