介绍
单例模式,顾名思义就是只有一个实例,并且她自己负责创建自己的对象,这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。下面我们来看下有哪几种实现方式吧。
实现方式
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、方便资源相互通信的环境。