设计模式 | 单例模式 饿汉式、多种懒汉式

单例模式

概述

  • 单例模式指一个类中只能创建一个实例。
  • 什么时候使用单例模式?
  1. 类的状态与对象无关。
  2. 频繁创建对象、管理对象是一件非常耗资源的事。

编写步骤

  • 构造函数私有化
  • 在类的内部创建实例
  • 提供获取唯一实例的方法

编写方式

饿汉式
/**
 * 单例:饿汉式
 */
public class Person {
    // 构造函数私有化
    private Person(){}
    // 创建唯一实例
    private static Person person = new Person();
    // 提供获取唯一实例方法
    public static Person getPerson() {
        return person;
    }
}
  • 上来就创建实例,如果该实例从始至终没有被用过,则会造成内存的浪费。
基本懒汉式
/**
 * 单例:懒汉式
 */
public class Person {
    // 构造函数私有化
    private Person(){}
    // 声明对象,不创建
    private static Person person = null;
    // 调用到下面的方法时,说明要用到类的实例
    public static Person getPerson() {
        // 创建实例
        if (person == null) {
        	person = new Person();
        }
        return person;
    }
}

  • 注意:多线程环境下需要加锁
private static synchronized Person getPerson()
双重检测机制(DCL)懒汉式
  • 上面的懒汉式即便加了synchronized还是会引起诸多问题,例如会创建不止一个对象、重排序…等问题(暂不深究)。所以就有了DCL式。
/**
 * 单例:双重检测机制(DCL)懒汉式
 */
public class Person {
    // 构造函数私有化
    private Person(){}
    
    private static volatile Person person = null;
    
    public static Person getPerson() {
        if (person == null) {
            // 将锁的范围缩小
            synchronized (Person.class) {
                // 再次判空
                if (person == null) {
                    person = new Person();
                }
            }
        }
        return person;
    }
}
静态内部类懒汉式
  • 上面的代码中我们使用了两种懒汉式实现单例模式,但是缺点显而易见:基本懒汉式不够安全,DCL式略显复杂。所以我们的终极懒汉式应运而生~
/**
 * 单例:静态内部类懒汉式
 */
public class Person {
    // 构造函数私有化
    private Person(){}
    // 使用静态内部类加载
    private static class Loader{
        // 创建单例对象
        private static final Person person = new Person();
    }
    // 获取对象
    public static final Person getInstance() {
        return Loader.person;
    }
}
  • 使用静态内部类来加载实例化对象,使得每次调用getInstance()方法时person都被初始化。
  • 初始化静态数据时,Java自身提供了安全保障,不需要我们考虑安全问题。
  • 非常好的写法,日后多多使用~
饿汉式与懒汉式的比较
  • 饿汉式:加载类时速度慢,运行时获得对象的速度比较快,从加载到应用结束会一直占用资源。
  • 懒汉式:运行时获得对象的速度较慢,但加载类时比较快,只有一部分时间在占用资源。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值