概述
单例模式可以简单理解为一个类只有一个实例化,并提供全局的访问点。
单例模式存在的意义
举个例子,在操作系统中,任务管理器只能存在一个,对吧。那么接下来的事情就是简单的实现单例模式了。
实现简单的单例模式
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace Singleton 7 { 8 public class Singleton 9 { 10 //使用静态变量保存类的实例 11 private static Singleton uniqueInstance; 12 13 //私有构造 14 private Singleton() 15 { 16 } 17 18 /// <summary> 19 /// 全局访问点 20 /// </summary> 21 /// <returns></returns> 22 public static Singleton GetInstance() 23 { 24 if (uniqueInstance==null) 25 { 26 Console.WriteLine("实例化 单例模式."); 27 uniqueInstance = new Singleton(); 28 } 29 else 30 { 31 Console.WriteLine("返回 单例模式"); 32 } 33 return uniqueInstance; 34 } 35 36 } 37 38 39 class Program 40 { 41 static void Main(string[] args) 42 { 43 Singleton.GetInstance(); 44 Singleton.GetInstance(); 45 } 46 } 47 }
1. 私有构造函数:
只有在该类中使用,不能被外界访问。也就是说,该类不能通过外界 new操作 实例化一个对象。而只能在本类中实例化。
2. 静态变量:
静态变量是在堆分配的,而普通变量是在栈上分配的,也就是说它的生存期为整个源程序。
3. 静态函数:
静态成员函数不可以调用类的非静态成员。因为静态成员函数不含this指针。 这里,我们使用静态函数访问静态变量。
多线程下的单例模式
在上诉代码中,如果是多线程的情况,很有可能会创建多个实例化。但是我们想要的是,只要第一次创建该实例,其他情况都返回该实例。我们的解决方案是采用线程加锁的方式。
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace Singleton 7 { 8 public class Singleton 9 { 10 //使用静态变量保存类的实例 11 private static Singleton uniqueInstance; 12 13 //私有构造 14 private Singleton() 15 { 16 } 17 18 19 //线程锁 20 private static readonly object locker = new object(); 21 22 /// <summary> 23 /// 全局访问点 24 /// </summary> 25 /// <returns></returns> 26 public static Singleton GetInstance() 27 { 28 if (uniqueInstance==null) 29 { 30 lock (locker) 31 { 32 if (uniqueInstance == null) 33 { 34 Console.WriteLine("实例化 单例模式."); 35 uniqueInstance = new Singleton(); 36 } 37 } 38 } 39 else 40 { 41 Console.WriteLine("返回 单例模式"); 42 } 43 return uniqueInstance; 44 } 45 46 } 47 48 49 class Program 50 { 51 static void Main(string[] args) 52 { 53 Singleton.GetInstance(); 54 Singleton.GetInstance(); 55 } 56 } 57 }