定义
确保一个类有且只有一个实例,并提供一个全局访问点。
UML类图
组成部分
- 定义一个类,允许客户端访问它的唯一实例
- 该类负责创建及维护自身唯一实例
代码部分
- 单例模式,单线程实现
1 /// <summary> 2 /// 单例实体 3 /// </summary> 4 class Singleton 5 { 6 private static Singleton _instance = null; 7 8 /// <summary> 9 /// 控制器为protected 10 /// </summary> 11 protected Singleton() { } 12 13 public static Singleton Instance() 14 { 15 //使用懒加载初始化 16 //线程不安全 17 if (_instance == null) 18 { 19 _instance = new Singleton(); 20 } 21 return _instance; 22 } 23 }
以上代码在单线程情况下,线程安全。但是在多线程情况下,当多个线程同时访问Instance(),同时进行null判断时,就会进行多次实例化,这违背了单例模式的原则-一个类有且只有一个实例。
- 单例模式,多线程实现
1 /// <summary> 2 /// 单例实体 3 /// </summary> 4 class Singleton 5 { 6 private static Singleton _instance = null; 7 8 /// <summary> 9 /// 控制器为protected 10 /// </summary> 11 protected Singleton() { } 12 13 private static object lockHelper = new object(); 14 15 public static Singleton Instance() 16 { 17 //使用懒加载初始化 18 //线程不安全 19 if (_instance == null) 20 { 21 lock (lockHelper) 22 { 23 if (_instance == null) 24 { 25 _instance = new Singleton(); 26 } 27 } 28 } 29 return _instance; 30 } 31 }
在多线程情况下,多加了一个锁的实现,进行了双重检索以防多次实例化。
实际应用
开发时会遇到饿汉模式与懒汉模式
- 饿汉式
1 class Singleton 2 { 3 private static Singleton _instance = new Singleton(); 4 5 protected Singleton() { } 6 7 public static Singleton Instance() 8 { 9 return _instance; 10 } 11 }
饿汉式单例在类被加载时就进行了实例化,使用时响应速度快
- 懒汉式,同多线程下代码
懒汉式单例在第一次使用时进行实例化,实现了延迟加载,节省了系统资源。
(注:开发过程中,经常遇到一系列代码设计上的问题,希望运用常用的设计模式来解决。在接下来的时间里,通过运用设计模式来解决日常工作中的问题,总结经验提升自己,同时希望有志同道合的小伙伴一起探讨。文字如有不妥之处,望请指出。)