模式定义
单例模式(Singleton Pattern):单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。
单利模式所要满足的条件:
- 只能有一个实例
- 必须自行创建
- 自行向整个系统提供访问
UML类图
- 私有静态自身类型字段
- 私有构造方法
- 公有静态函数返回自身对象
代码结构
public static class SingletonApp
{
public static void Run()
{
Singleton s1 = Singleton.Instance();
Singleton s2 = Singleton.Instance();
if(s1 == s2)
{
Console.WriteLine("Objects are the same instance");
}
}
}
public class Singleton
{
private static Singleton _instance;
protected Singleton()
{}
public static Singleton Instance()
{
if(_instance == null)
{
_instance = new Singleton();
}
return _instance;
}
}
多线程代码结构
这里介绍著名的双锁机制。(思考:一个类中有一静态字段和一修改该字段的静态方法,对于多线程是否都是不安全的?)
public class Singleton
{
private static Singleton _instance;
protected Singleton()
{ }
public static Singleton Instance()
{
if (_instance == null)
{
lock (typeof(Singleton))
{
if (_instance == null)
{
_instance = new Singleton();
}
}
}
return _instance;
}
}
C#语法优化
我们用的C#语言是高级、简洁的语言。那么更简洁的写法为:(注意关键词readonly
)
public class Singleton
{
private static readonly Singleton _instance = new Singleton();
protected Singleton()
{ }
public static Singleton GetInstance()
{
return _instance;
}
}
情景模式
利用单例模式主要用来限制类只能实力化一个对象,所有访问都访问唯一一个对象。有时我们读取配置文件时,创建单例模式。