解释:
类仅有一个实例(只能new一次)
提供外界的访问点。
能够自行创建实例
什么时候用到:
要控制类的全局实例只有一个,比如windows中,任务管理器,不管打开多少次只有一个。
如何实现:
外界不能new对象,那么哪里new,当然是类的内部,把构造方法private,内部进行实例,并且提供外界的访问点。
写法 1 (懒汉式)
public class Singleton
{
//持有自己
private static Singleton instance = null;
//私有化构造函数
private Singleton()
{
}
//获取实例
public static Singleton GetInstance()
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
写法 2(饿汉式)
public class Singleton
{
//持有自己,在声明是就已经new了
private static Singleton instance = new Singleton();
//私有化构造函数
private Singleton()
{
}
//获取实例
public static Singleton GetInstance()
{
return instance;
}
}
写法3
使用属性,道理相同
public class Singleton
{
private static Singleton instance;
public Singleton Instance
{
get
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
}
这样写会有一个问题,
当多个用户或者方法同时访问的时候,便会出现多个用户同时拿到了mSingleton==null的结果,
多线程内就是这样,好吧,我承认这段是抄别人的
话说多线程是个什么鬼。。。。噢,天哪 我也是看人家博客
多线程,比如qq聊天界面,会同时存在多个聊天,多个程序同时运行
这样理解,多个方法同时调用了GetInstance获取实例,都进入了if(mSingleton == null) 且判断都为空,都会去调用new,这个明显不是我们想要的
这时你就需要一个东西加锁lock。
锁!我擦勒 不会,就是这么理直气壮?
查了查资料,说白了就是给代码放进小柜子中,
当有(人\程序\方法)在使用代码时,(人\程序\方法)不能使用
只能我用,用完了别人才能使用。
写法4
public class Singleton
{
//持有自己
private static Singleton instance = null;
private static readonly object padLock = new object();
//私有化构造函数
private Singleton()
{
}
//获取实例
public static Singleton GetInstance()
{
if (instance == null)
{
lock (padLock)
{
if(instance == null)
{
instance = new Singleton();
}
}
}
return instance;
}
}
感觉还不完善,欢迎大佬指点