模式释义
Ensure a class only has one instance, and provide a global point of access to.
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
模式要点
1. 一个类只有一个实例;
2. 必须自行创建实例;
3. 自行向整个系统提供实例
模式实现要点
1. 单例模式的类只提供私有的构造函数;
2. 类定义含有类的静态私有对象;
3. 提供一个静态的共有函数创建或获取本身的静态私有对象;
实现方式
- 经典模式:
class Singleton { private static Singleton instance; //构造方法设为private,防止外界new创建实例 private Singleton() { } //获取本类实例的唯一全局访问点 public static Singleton Getinstance() { //若实例不存在,则new一个新的实例,否则返回已有实例 if (instance == null) { instance = new Singleton(); } return instance; } }
调用方法:
Singleton singleton = Singleton.Getinstance();
- 多线程下的单例模式
- 双锁模式(Double-Check Locking):(懒汉式单例类)
第一次引用时,才会将自己实例化
class Singleton { private static Singleton instance; private static readonly object _syncRoot = new object(); //构造方法设为private,防止外界new创建实例 private Singleton() { } //获取本类实例的唯一全局访问点 public static Singleton Getinstance() { //先判断实例是否存在,不存在再加锁处理 if (instance == null) { //lock确保当一个线程位于代码的临界区时,另一个线程不进入临界区 //其他线程试图进入锁定的代码,它将一直等待 lock (_syncRoot) { //若实例不存在,则new一个新的实例,否则返回已有实例 if (instance == null) { instance = new Singleton(); } } } return instance; } }
- 静态初始化(饿汉式单例类):
在自己加载时将自己实例化
//sealed:阻止发生派生,派生可能会增加实例 public sealed class Singleton { //readonly第一次引用类的任何成员时创建实例; //公共语言运行库复测处理变量初始化 private static readonly Singleton instance = new Singleton(); private Singleton() { } public static Singleton Getinstance() { return instance; } }
单例模式优点
1. 实例控制:阻止其他对象实例化其自己单例对象的副本,从而保证所有对象都访问唯一实例;
2. 灵活性
单例模式缺点
1. 开销:每次请求时都需要检查是否存在类的实例。用静态初始化解决此问题。
2. 可能的开发混淆:开发时不能用new关键字实例化对象。
3. 对象生命周期:不能解决删除单个对象的问题。
应用场景
资源管理器
打印机