设计模式:单例模式

单例模式主要是为了防止对象不必要/不合理地被创建多次
例如:线程池,打印队列,对话框,部分窗体界面等
单例模式的类有且只能有一个实例化对象

通过简单工厂模式实现单例模式,此方式简便易用但线程不安全

/**
 * 单例模式
 * 通过工厂模式,在第一次调用时实例化自己
 * @author hector
 *
 */
public class Singleton {

    /**
     * 定义private构造器以取代public构造器,阻止此类在外部通过new关键字实例化
     */
    private Singleton(){}

    /**
     * 此类的实例化对象,单例模式应当由自己创建并返回自己的实例化对象
     */
    private static Singleton singleton = null;

    /**
     * 静态工厂模式创建对象,且仅当类中对象为null时执行一次创建
     * 对此调用该方法返回的对象为同一个
     * @return
     */
    public static Singleton getSingleton(){
        if(singleton==null){
            singleton = new Singleton();
        }
        return singleton;
    }
}

利用线程锁可以解决这个问题,为静态工厂类增加线程锁,使其在线程上安全

/**
     * 静态工厂模式创建对象,且仅当类中对象为null时执行一次创建
     * 对此调用该方法返回的对象为同一个
     * 通过synchronized锁锁定静态工厂,使得该单例模式创建方式线程安全
     * @return
     */
    public static Singleton getSingleton(){
        if(singleton==null){
            singleton = new Singleton();
        }
        return singleton;
    }

但是,众所周知的,线程同步会带来一定的性能上的影响,故此,这样的方式仍然存在一定的问题,一个更优的处理方式是,使用静态内部类完成对象的实例化

/**
 * 通过静态内部类创建完成单例类的对象实例化
 * 以私有内部类封装对对象的实例化操作,避免外部探知实例化的情况
 * 以静态final成员变量确保实例化过程的唯一性
 * @author Hector
 */
public class StaticSingleton {

    /**
     * private构造器阻止该类被外部通过new关键词实例化
     */
    private StaticSingleton(){}

    /**
     * 单例模式获取内部静态类提供的实例化对象
     * @return
     */
    public static final StaticSingleton getSingleton(){
        return StaticSingletonController.SINGLETON;
    }

    /**
     * 由于采用了内部静态类的方式完成实例化,该对象会且只会在该类被加载时被实例化一次
     * @author Hector
     */
    private static class StaticSingletonController{
        /**
         * final型的实例化StaticSingleton对象,提供唯一的单例类实例化对象
         */
        private static final StaticSingleton SINGLETON = new StaticSingleton();
    }
}

此方式规避了多线程同步对于性能的影响,并且实现了在多线程下的线程安全.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值