1. 简介定义: 保证一个类仅有一个实例,并提供一个该实例的全局访问点。 注意:
2. 示例2.1. 最常见的单例模式public class Singleton { //保存实例容器 private static Singleton instance = null; //取消默认的public的缺省构造器 private Singleton() { } //实例的出口 public static Singleton Instance { get { if (instance == null) { instance = new Singleton(); } return instance; } } } 2.2. 线程安全的单例模式public class Singleton { //volatile 它是被设计用来修饰被不同线程访问和修改的变量。 //如果没有volatile,基本上会导致这样的结果: //要么无法编写多线程程序,要么编译器失去大量优化的机会。 //volatile的作用: 作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值. private static volatile Singleton instance = null; private static object lockHelper = new object(); //取消默认的public的构造器 private Singleton() { } //实例的出口 public static Singleton Instance { get { //double check 前面的判断是为了减少后面判断的访问,因为后面的判断会阻塞并发线程 if (instance == null) { lock (lockHelper) { if (instance == null) { instance = new Singleton(); } } } return instance; } } } 2.3. 线程安全且简练的单例模式利用了静态构造方法是线程安全的。 缺点: 不接受参数 public class Singleton { public static readonly Singleton Instance = new Singleton(); private Singleton() { } } 等价于 public class Singleton { public static readonly Singleton Instance; static Singleton() { Instance = new Singleton(); } private Singleton() { } } 说明:
2.4. 含参数的单例模式一般情况下用不到。 public class Singleton { //保存实例容器 private static Singleton instance; //取消默认的public的构造器 private Singleton(int x,int y) { this.x = x; this.y = y; } //实例的出口 public static Singleton GetInstance(int x, int y) { if (instance == null) { instance = new Singleton(x,y); } else { instance.x = x; instance.y = y; } return instance; } private int x; private int y; } |
|