设计模式之单例模式

定义

通过将类构造方法私有化,仅通过静态方法作为全局访问点提供该类唯一的一个对象,即为单例模式。
单例模式属于创建型模式,需保证该类对象全局有且只有一个。

实现

饿汉式单例

即在类加载阶段就调用私有构造方法生成一个对象实例,再提供一个静态方法返回该实例引用,保证全局只会生成一个该类对象实例;

/**
 * 单例模式
 * 饿汉式,即在类加载时就调用私有构造方法生成对象实例
 */
public class Singleton {

    //类加载时就调用私有构造方法生成对象实例
    private static Singleton instance = new Singleton();

    //构造方法私有化
    private Singleton() {}

    /**
     * 需要对象实例调用getInstance静态方法即可
     * @return instance
     */
    public static Singleton getInstance() {
        return instance;
    }
    
}

懒汉式单例

即单例对象延迟加载,仅在首次获取时生成该对象实例,后续则直接使用该对象不再重新生成保证单例

/**
 * 单例模式
 * 懒汉式,即单例对象延迟加载,仅在首次获取时生成该对象实例,后续则直接使用该对象不再重新生成保证单例
 */
public class Singleton {
	//通过volatile机制防止指令重排序,防止出现DCL失效问题
    private volatile static Singleton instance;

    //构造方法私有化
    private Singleton() {}


    /**
     * 仅在首次获取时生成该对象实例,后续则直接使用该对象不再重新生成保证单例
     * 需要双重检查加锁保证线程安全
     * @return instance
     */
    public static Singleton getInstance() {
        //判断对象为空则尝试进入同步代码块争抢锁
        if (instance == null) {
            synchronized (Singleton.class) {
                //获得锁后需要重新判空一次,否则极端情况下当前线程判空成功获得锁前,正好有其他线程生成对象实例释放锁,
                //会导致前后两次调用getInstance方法生成不同实例,破坏单例,因此做双重检查加锁是必须的;
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }

}

静态内部类式单例

/**
 * 单例模式
 * 静态内部类方式实现单例
 */
public class Singleton {

    //构造方法私有化
    private Singleton() {}

    private static class SingletonHolder {
        private static Singleton INSTANCE = new Singleton();
    }

    /**
     * 线程安全,通过静态内部类保证单例
     * @return
     */
    public static Singleton getInstance() {
        //getInstance方法首次调用时才会加载加载静态内部类SingletonHolder,从而生成对象实例实现懒加载
        return SingletonHolder.INSTANCE;
    }

}

枚举式单例

/**
 * 单例模式
 * 通过枚举实现单例
 */
public enum Singleton {

    INSTANCE;

}

如何破坏单例?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值