目录

  1. 单例模式
    1. 单例设计模式八种方式
  2. 类图
    1. 实现
      1. 饿汉式单例模式
        1. 懒汉式单例模式
        2. 面试题
  3. 总结

单例模式

所谓类的单例设计模式,就是采取一定的方法保证在整个软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法,getInstance())

✨单例模式特点

  • 某个类只能由一个实例(构造器私有)
  • 它必须自行创建这个实例(自己编写实例化逻辑)
  • 它必须自行向整个系统提供这个实例(对外提供实例化方法)

单例设计模式八种方式

✨单例模式的八种方式:

  1. 饿汉式(静态常量)
  2. 饿汉式(静态代码块)
  3. 懒汉式(线程不安全)
  4. 懒汉式(线程安全,同步方法)
  5. 懒汉方式(线程安全,同步代码块)
  6. 双重检查
  7. 静态内部类
  8. 枚举

🤔如何保证类在内存中只有一个对象尼?

  • 构造方法私有
  • 在成员位置自己创建一个对象
  • 通过一个公共的方法提供访问

类图

使用一个私有构造函数、一个私有静态变量以及一个公有静态函数来实现

私有构造函数保证了不能通过构造函数来创建对象实例,只能通过公有静态函数返回唯一的私有静态变量

实现

饿汉式单例模式

类一加载就创建对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Student {
private Student() {}

private static Student student = new Student();

public static Student getStudent() {
return Student.student;
}
}
public static void main(String[] args) {
//
Student s1 = Student.getStudent();
Student s2 = Student.getStudent();
System.out.println(s1 == s2);//s1与s2相同
System.out.println(s1);
System.out.println(s2);
}

懒汉式单例模式

只有在使用的时候才创建对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Lazy {
private static Lazy lazy = null;

private Lazy() {}

public static Lazy getLazy() {
if (lazy == null) {
lazy = new Lazy();
}
return lazy;
}
}
public static void main(String[] args) {
Lazy l1 = Lazy.getLazy();
Lazy l2 = Lazy.getLazy();
System.out.println(l1);
System.out.println(l2);
}

面试题

单例模式的思想是什么?

懒汉式的思想就是延迟加载

开发中:饿汉式(是不会出现问题的单例模式)

面试中:懒汉式(可能会出现问题的单例模式,线程不安全)

判断程序是否存在线程安全问题需要考虑的三点:

  • 是否为多线程环境
  • 是否有共享数据
  • 是否有多条语句操作共享数据

在外部类进行类状态时,静态内部类不会被装载

总结