动机:在软件系统中,经常有这样的一些特殊的类,必须保证它们在系统中 只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率
意图:保证一个类仅有一个实例,并提供一个该实例的全局访问点
UML图:
示例代码:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace Singleton 7 { 8 /// <summary> 9 /// 只适用单线程下的单例模式,在多线程下无法保证其唯一实例 10 /// </summary> 11 //public class Singleton 12 //{ 13 // private static Singleton instance; 14 // private Singleton() { } 15 // public static Singleton Instance 16 // { 17 // get 18 // { 19 // if (instance == null) 20 // { 21 // instance = new Singleton(); 22 // } 23 // return instance; 24 // } 25 // } 26 //} 27 28 29 /// <summary> 30 /// 第一种:多线程单例模式的设计 31 /// </summary> 32 //public class Singleton 33 //{ 34 // //volatile 会保证编译器不对代码指令的执行调整顺序,而保证其严格意义上的的按顺序执行 35 // private static volatile Singleton instance=null; 36 // private static object lockHepler = new object();//起辅助作用 37 // private Singleton() { } 38 // public static Singleton Instance 39 // { 40 // get 41 // { 42 // if (instance==null) 43 // { 44 // lock (lockHepler) 45 // { 46 // if (instance == null) 47 // { 48 // instance = new Singleton(); 49 // } 50 // } 51 // } 52 // return instance; 53 // } 54 // } 55 //} 56 57 /// <summary> 58 /// 第二种:多线程单例模式的设计 59 /// </summary> 60 public class Singleton 61 { 62 public static readonly Singleton Instance = new Singleton();//内联初始化 63 private Singleton() { } 64 } 65 66 /// <summary> 67 /// 第二种实现等同于下面的实现,但这两者的弊端:就是不支持参数化传递的构造器 68 /// </summary> 69 //public class Singleton 70 //{ 71 // public static readonly Singleton Instance; 72 73 // //.NET机制会保证只有一个线程执行此82行代码,以加锁的方式防止又一个线程执行 74 // //在第一次访问任意静态字段之前,都会执行静态构造器,以保证静态字段都已初始化 75 // static Singleton() { Instance = new Singleton(); } 76 // private Singleton() { } 77 //} 78 79 }
注:本示例代码是本人学习Webcast C#面向对象设计模式纵横谈系列讲座视频时,跟着李建忠老师一步一步的编写的,在此奉献出来,仅供大家参考