单例模式:“保证一个类仅有一个实例,并提供一个访问它的全局访问点”——《设计模式》
一个打印机系统中可以存在多个打印任务,但是只能有一个正在工作的任务;过多任务的产生和等待浪费内存资源,从而对一些内存资源较少的嵌入式设备等产生严重的影响;如果希望系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
要点:
1 单例类只能有一个实例
2 单例类必须自己创建自己的唯一实例
3 单例类必须给所有其他对象提供这一实例
代码实现1
public class Spooler
{
private static Spooler ms_spooler = new Spooler();
private Spooler()
{
}
public static Spooler Createnlnsance()
{
return ms_spooler;
}
}
代码1是单例模式中的勤快模式
优点在于程序运行时创建空间,下面程序直接调用,比较稳定;
缺点在于不具备延时初始化的能力,如果下面程序不会调用该方法,会造成空间上的浪费
代码实现2
public class Spooler
{
private static Spooler ms_spooler = null;
private Spooler()
{
}
public static Spooler Createnlnsance()
{
if(ms_spooler == null)
{
ms_spooler = new Spooler;
}
return ms_spooler;
}
}
代码2是单例模式中的懒惰模式
相比勤快模式而言,懒惰模式在需要调用该方法的时候才创建空间,但是如果两个或更多的线程同时调用Createnlnsance来获取实例,程序可能不会给出预期结果
代码实现3
public class Spooler
{
private static Spooler ms_spooler = null;
private Spooler()
{
}
public static synchronized Spooler Createnlnsance()
{
if(ms_spooler == null)
{
ms_spooler = new Spooler();
}
return ms_spooler;
}
}
代码3通过synchronized方法来控制Createnlnsance();的访问权限,当有任意线程在使用Createnlnsance();的时候,其他线程要等该线程运行结束