单件模式(创建型)

一:相关定义

单件模式:确保一个类只有一个实例,并提供一个全局访问点。

二:相关类图

类图:


挺简单的一个模式,就不多说了,但在多线程情况下要注意使用同步:

public class Singleton{
    private volatile static Singleton uniqueInstance;
    //其他有用的实例化的变量
    //构造器私有
    private Signleton(){}
    public static Singleton getInstance(){
        if(uniqueInstance == null){
            synchronized (Singleton.class){
                if(uniqueInstance == null){
                    uniqueInstance = new Singleton();
                }
            }
        }
    }
}

这里使用的是双重检查锁定来创建对象,主要是为了避免在进入getInstance()方法时加锁,提高效率;同时这里的引用uniqueInstance需要声明为volatile的,不然可能导致对象在未构造完成之前就被赋值给引用(Jdk1.5增强了volatile语义,禁止了相关的重排序;之前的版本使用这种方式创建时会有问题)

还有一种方式就是使用类似工厂模式,将创建对象的责任交给第三方,然后进行返回;(因为类的初始化锁会使得当前只有一个线程进行类加载初始化,防止了并发的问题)

public class InstanceFactory{
    private static class InstanceHolder{
        public static Singleton instance = new Singleton();
    }
    public static Singleton getInstance(){
        //这里将导致InstanceHolder类被初始化
        return InstanceHolder.instance;
    }
}

或者在静态初始化中创建单件,但这就不是延时加载了。其实上面那种就是这个的变种。

private static Singleton uniqueInstance = new Singleton();
//然后在静态方法中返回
......


参考书籍《head first 设计模式》《java并发编程的艺术》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值