单例:在程序的整个进程中只会被实例化一次
如: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;
}
}
}