- A+
所属分类:.NET技术
介绍
单例模式,顾名思义就是只有一个实例,并且她自己负责创建自己的对象,这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。下面我们来看下有哪几种实现方式吧。
实现方式
1、使用lock ,保证方法只有一个线程可以进入。
/// <summary> /// 单例类 /// </summary> public class Singleton { private Singleton() { long lResult = 0; for (int i = 0; i < 100 - 000 - 000; i++) { lResult += i; } Thread.Sleep(2000); Console.WriteLine($"{this.GetType().Name}完成构造...."); } private static Singleton Instance = null; private static readonly object Singleton_Lock = new object(); public static Singleton CreateInstance() { if (Instance == null) { lock (Singleton_Lock)//保证方法块儿只有一个线程可以进入 { Console.WriteLine("进入lock排队...."); Thread.Sleep(1000); if (Instance == null) Instance = new Singleton(); } } return Instance; } public static void DoNothing() { Console.WriteLine("DoNothing"); } public void Show() { Console.WriteLine($"{this.GetType().Name} Show...."); } }
2、使用静态构造函数,由CLR调用,在类型第一次被使用前调用,且只调用一次。
/// <summary> /// 单例类 /// </summary> public class SingletonSecond { private SingletonSecond() { long lResult = 0; for (int i = 0; i < 100 - 000 - 000; i++) { lResult += i; } Thread.Sleep(2000); Console.WriteLine($"{this.GetType().Name}完成构造...."); } private static SingletonSecond Instance = null; /// <summary> /// 静态构造函数,由CLR调用,在类型第一次被使用前调用,且只调用一次! /// </summary> static SingletonSecond() { Instance = new SingletonSecond(); } public static SingletonSecond CreateInstance() { return Instance; } public static void DoNothing() { Console.WriteLine("DoNothing"); } public void Show() { Console.WriteLine($"{this.GetType().Name} Show...."); } }
3、使用静态字段,由CLR调用,在类型第一次被使用前初始化,且只初始化一次。
/// <summary> /// 单例类 /// </summary> public class SingletonThird { private SingletonThird() { long lResult = 0; for (int i = 0; i < 100 - 000 - 000; i++) { lResult += i; } Thread.Sleep(2000); Console.WriteLine($"{this.GetType().Name}完成构造...."); } /// <summary> /// 静态字段,由CLR调用,在类型第一次被使用前初始化,且只初始化一次! /// </summary> private static SingletonThird Instance = new SingletonThird(); public static SingletonThird CreateInstance() { return Instance; } public static void DoNothing() { Console.WriteLine("DoNothing"); } public int iNum = 0; public void Show() { Console.WriteLine($"{this.GetType().Name} Show..{iNum++}.."); } public void Add() { this.iNum++; } }
使用场景
1、需要生成唯一序列的环境。
2、需要频繁实例化然后销毁的对象。
3、创建对象时耗时过多或者耗资源过多,但又经常用到的对象。
4、方便资源相互通信的环境。