1、单例模式的实现首先要考虑的一个方面是不能被外部实例化,
所以构造函数定义为private.然后还要返回一个实例。
代码如下:
public class Singleton
{
private static Singleton _instance = null;
private Singleton(){}
public static Singleton CreateInstance()
{
if(_instance == null)
{
_instance = new Singleton();
}
return _instance;
}
}
多个实例的情况。为了避免这种情况可以加锁,代码如下
public class Singleton
{
private volatile static Singleton _instance = null;
private static readonly object lockHelper = new object();
private Singleton(){}
public static Singleton CreateInstance()
{
lock(lockHelper)
{
if(_instance == null)
_instance = new Singleton();
}
return _instance;
}
}
3、第二种情况所以已经解决了多线程情况下创建多个实例的可能性,但是性能方面有缺陷,海量线程访问的情况下会影响性能,如下代码可以解决该问题。
public class Singleton
{
private volatile static Singleton _instance = null;
private static readonly object lockHelper = new object();
private Singleton(){}
public static Singleton CreateInstance()
{
if(_instance == null)
{
lock(lockHelper)
{
if(_instance == null)
_instance = new Singleton();
}
}
return _instance;
}
}
4、第四种情况是高级语言里面特有的代码。
public class Singleton
{
private Singleton(){}
public static readonly Singleton instance = new Singleton();
}
单例模式的特点:
- 单例类只能有一个实例。
- 单例类必须自己创建自己的唯一实例。
- 单例类必须给所有其它对象提供这一实例。
单例模式应用:
- 每台计算机可以有若干个打印机,但只能有一个Printer Spooler,避免两个打印作业同时输出到打印机。
- 一个具有自动编号主键的表可以有多个用户同时使用,但数据库中只能有一个地方分配下一个主键编号。否则会出现主键重复。