单例模式,也是非常好理解的一种设计模式。
单例,也叫单件,目的是为了保证一个类只有一个实例。当然,没使用上单例模式的时候,在代码实现时候,注意不要随便new某个对象,这…..的确可以,但很不安全。因此简单代码一处理,一个单例模式便出来了。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _2_单例模式
{
public class SingletonInfo
{
private static SingletonInfo info = null;
private SingletonInfo() { }
public static SingletonInfo GetInfo()
{
if (null == info)
{
info = new SingletonInfo();
}
return info;
}
}
class Program
{
static void Main(string[] args)
{
// SingletonInfo info = new SingletonInfo();因为构造函数是私有的,所以编译器不给new
SingletonInfo info = SingletonInfo.GetInfo();//这样就能基本保证SingletonInfo类只有一个实例,前提是没有多线程
}
}
}
上边的写法叫做懒汉模式,所谓懒,就是没到用它的那天,它都不肯生成个实际出来,以节约资源。然而还有另外一种差不多的写法,叫饿汉模式,则系统始终阶段它便有那么一个实际。实际上就只稍做改变
public class EagerSingletonInfo
{
private static EagerSingletonInfo info = new EagerSingletonInfo();//它 的静态实例,始终阶段就new出来了
private EagerSingletonInfo() { }
public static EagerSingletonInfo GetInfo()
{
return info;
}
}
另外,第一段代码中还提及到所写的单例只针对没有多线程的情况,面对多线程,有较小的概率还是会不安全的。
public static SingletonInfo GetInfo()
{
if (null == info)
{//如果两个或以上的线程同时跑到这里来,就不止得一个实例了
info = new SingletonInfo();
}
return info;
}
解决起来也无非加锁,做法常规则,只不过lock在开发中的不多用。
public class SingletonInfo
{
private static SingletonInfo info = null;
private static object objHelpless = new object();//制造个没实际作用的对象出来,只为加锁
private SingletonInfo() { }
public static SingletonInfo GetInfo()
{
if (null == info)//先不加锁判断下,如果它本身非空,每次都锁着判断,性能会下降了点
{
lock (objHelpless)
{
if (null==info)//这时候带锁判断,安全可靠
{
info = new SingletonInfo();
}
}
}
return info;
}
}
现实中,用到单例模式的地方也不少,例如:web中的application、windows中的任务管理器、回收站。这些功能均需要保证只有一个实际的存在。