這種類型的設計模式屬於創建型模式,它提供了一種創建對象的最佳方式。
這種模式涉及到一個單一的類,該類負責創建自己的對象,同時確保只有單個對象被創建。這個類提供了一種訪問其唯一的對象的方式,可以直接訪問,不需要實例化該類的對象。
實現思路:
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();
});
}