【设计模式】 单例模式

单例模式:“保证一个类仅有一个实例,并提供一个访问它的全局访问点”——《设计模式》

一个打印机系统中可以存在多个打印任务,但是只能有一个正在工作的任务;过多任务的产生和等待浪费内存资源,从而对一些内存资源较少的嵌入式设备等产生严重的影响;如果希望系统中某个类的对象只能存在一个,单例模式是最好的解决方案。


要点:

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();的时候,其他线程要等该线程运行结束




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值