这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
实现思路:
1:私有化构造方法
2:暴露创建对象的方法
3:存储创建的对象
方法1:
public static SingletonClass _singleton = null;
public static readonly object lockObj = new object();
public void Show()
{
Console.WriteLine("Singleton............");
}
public static SingletonClass GetInstance()
{
if (_singleton == null)
{
_singleton = new SingletonClass();
}
}
private SingletonClass()
{
var IResult = 0L;
for (int i = 0; i < 1000000; i++)
{
IResult += i;
}
Thread.Sleep(1000);
Console.WriteLine("SingletonClass被构造。。。。。。。");
}
调用:
for (int i = 0; i < 10; i++)
{
SingletonClass singleton = SingletonClass.GetInstance();
singleton.Show();
}
这种方式在非多线程下是可以达到目的,但是在多线程下就会出现下面的结果:
for (int i = 0; i < 5; i++)
{
Task.Run(() =>
{
SingletonClass singleton = SingletonClass.GetInstance();
singleton.Show();
});
}
解决方式 :双重if加锁
if (_singleton == null)
{
lock (lockObj)
{
if (_singleton == null)//不多余
{
_singleton = new SingletonClass();
}
}
}
方法3:
使用静态构造函数或者静态字段
public sealed class SingletonSecClass
{
public static SingletonSecClass _singletonSec = null;
//静态字段
// public static SingletonSecClass _singletonSec =new SingletonSecClass();
private SingletonSecClass()
{
var IResult = 0L;
for (int i = 0; i < 1000000; i++)
{
IResult += i;
}
Thread.Sleep(1000);
Console.WriteLine("SingletonSecClass被构造。。。。。。。");
}
static SingletonSecClass()
{
_singletonSec = new SingletonSecClass();
}
public static SingletonSecClass GetInstance()
{
return _singletonSec;
}
public void Show()
{
Console.WriteLine("Singleton............");
}
}
for (int i = 0; i < 5; i++)
{
Task.Run(() =>
{
SingletonSecClass singletonSec = SingletonSecClass.GetInstance();
singletonSec.Show();
});
}