1、动机(应用场景):
在软件系统中,必须保证系统中只存在一个实例,才能确保逻辑正确性和良好的效率。
2、意图:
保证一个类仅有一个实例,并提供全局访问点。
3、实现:
有的人可能会觉得,要保证一个系统中一个类只能有一个实例,那么这个类和平常一样写,然后你在系统中只实例化一次不就得了?
其实这应该是类的设计者的责任还,而不是类的使用者的责任。
1)单线程下Singleton单件模式的实现:
单线程下Singleton单件模式实现的主要有两个步骤。
第一是构造器加上static静态字段,防止使用止使用的时候实例化;
第二是取得对象值的时候,判断对象是否已经存在(是否为null),如果存在,则无需实例化,直接返回对象的成员,如果不存在,则实例化。
/// <summary> /// 单线程下 Singleton 单件模式 例子 ///[ZengWenZhi] 2012-8-3创建 /// </summary> public class Singleton { private static Singleton instance; //私有构造器,防止被 new。
private Singleton() { } public static Singleton Instance { get { if (instance==null) { instance = new Singleton(); } return instance; } } }
2)多线程下Singleton单件模式的实现:
多线程下单件模式的关键技术是lock技术。如下代码所示,在多线程环境下,可能两个线程同时运行到A点(A\B点一下代码有标注),这样两个线程都会判断到instance对象为空,这样,两个线程都会运行到B点。假如没有B点的代码,就会创建两个instance对象,有了B点的代码就可以避免这个问题。
/// <summary> /// 多线程下 Singleton 单件模式 例子 ///[ZengWenZhi] 2012-8-3创建 /// </summary> public class SingletonM { //volatile 当一个变量定义为volatile时,读取这个变量的值时候每次都是从momery里面读取而不是从cache读。
//这样做是为了保证读取该变量的信息都是最新的,而无论其他线程如何更新这个变量 private static volatile SingletonM instance = null; private static object lockHelper = new object(); private SingletonM() { } public static SingletonM Instance { get { if (instance==null)//A点 { lock (lockHelper)//B点 { //双检查 预防代码编译的时候作出优化调整了代码执行顺序 if (instance==null) { instance = new SingletonM(); } } } return instance; } } }
3、.net框架下Singleton单件模式的身影:
/// <summary> /// Singleton 单件模式实例 ///[ZengWenZhi] 2012-8-3创建 /// </summary> class Program { static void Main(string[] args) { //.Net框架中的应用 MyClass class1 = new MyClass(); MyClass calss2 = new MyClass(); Type type1 = class1.GetType(); Type type2 = class1.GetType(); //发现两个输出是一样的,这说明全局中只有一个MyClass 的type对象。 Console.WriteLine(type1.ToString()); Console.WriteLine(type2.ToString()); Console.ReadLine(); } } //应用 class MyClass { }
重要声明:本文是笔者学习李建中老师的时候所记录笔记,里面知识并非原创。