單例:在程序的整個進程中只會被實例化一次
如:User user =new User();實例化一個User();的時候new User()是調用的 User類的 默認的公有構造函數:public User(){};
一.想要整個程序只實例化一次這個User的話如:
1.private static User_user=null; 定義一個私有的靜態變量
2.提供靜態公有方法返回實例化對象
public static GetUser(){ if(User_user==null) { User_user=new User(); } return User_user; }
3.調用:User user =User.GetUser();//進行返回單個實例
4.多線程的時候需要加一把鎖:
private static object _lock =new object();//定義一個靜態的對象最好是object類型 public static GetUser(){ if (User_user==null) { lock (_lock) { if(User_user==null) { User_user=new User(); } } } return User_user; }
二.想要整個程序只實例化一次這個User的話如:
private static User User_user =null;//提供私有靜態實例對象 static User()//CLR運行的時候,第一次使用這個類之前,一定會而且只執行一次 { User_user =new User(); } public static GetUser()//提供公有靜態方法供外部調用 { return User_user; }
//雙重鎖機制
namespace Singleton
{
public class Singleton
{
//定義一個私有的靜態全局變量來保存該類的唯一實例
private static Singleton singleton;
//定義一個只讀靜態對象
//且這個對象是在程序運行時創建的
private static readonly object syncObject = new object();
/// <summary>
/// 構造函數必須是私有的
/// 這樣在外部便無法使用 new 來創建該類的實例
/// </summary>
private Singleton()
{ }
/// <summary>
/// 定義一個全局訪問點
/// 設置為靜態方法
/// 則在類的外部便無需實例化就可以調用該方法
/// </summary>
/// <returns></returns>
public static Singleton GetInstance()
{
//這里可以保證只實例化一次
//即在第一次調用時實例化
//以后調用便不會再實例化
//第一重 singleton == null
if (singleton == null)
{
lock (syncObject)
{
//第二重 singleton == null
if (singleton == null)
{
singleton = new Singleton();
}
}
}
return singleton;
}
}
}
