❤ 作者主页:欢迎来到我的技术博客😎
❀ 个人介绍:大家好,本人热衷于Java后端开发,欢迎来交流学习哦!( ̄▽ ̄)~*
🍊 如果文章对您有帮助,记得关注、点赞、收藏、评论⭐️⭐️⭐️
📣 您的支持将是我创作的动力,让我们一起加油进步吧!!!🎉🎉
文章目录
一、什么是单例模式
单例模式 指在内存中只会创建且仅创建一次对象的设计模式。
在程序中 多次使用同一对象且作用相同 时,为了防止频繁地创建对象使得内存飙升,单例模式可以让程序仅在内存中 创建一个对象,让所有需要调用的地方都 共享 这一单例对象。
未使用单例模式:
使用单例模式:
二、单例模式的结构
单例模式通常由以下几个组成部分构成:
-
单例类(Singleton): 单例类是单例模式的 核心,它包含一个私有的构造方法、一个私有的静态实例变量和一个公共的静态访问方法。单例类负责创建并提供访问单例实例的唯一途径。
-
静态实例变量(Instance): 单例类中通常包含一个私有的静态实例变量,用于保存单例实例。该变量被声明为私有的,以保证只有单例类内部可以访问和修改它。
-
公共的静态访问方法(getInstance): 单例类通过公共的静态访问方法提供对单例实例的全局访问。该方法通常被命名为
getInstance()
,在方法内部实现懒加载或饿加载实例的创建,并返回单例实例。
单例模式的结构示意图如下:
在这个结构中,单例模式的核心是单例类,它负责创建并提供访问单例实例的方法。通过静态实例变量,单例类确保只有一个实例存在,并通过静态访问方法使得外部代码可以获取该实例。
三、单例模式的类型
单例模式主要有以下两种类型:
- 懒汉式: 在 真正需要使用 对象时才会去创建该单例类对象。
- 饿汉式: 在 类加载 时已经创建好该单例对象,等待被程序调用。
四、单例模式的实现
1. 饿汉式
在饿汉式的单例模式中,实例在类加载时就被创建,因此不存在多线程安全问题。以下是两种常见的饿汉式单例模式的实现方式:
1.1 静态变量实现
核心方法:
public class Singleton {
// 在类加载时就创建实例
private static final Singleton instance = new Singleton();
// 私有构造函数,防止外部实例化
private Singleton() {
}
// 静态方法返回单例实例
public static Singleton getInstance() {
return instance;
}
}
测试类:
public class Singleton {
// 在类加载时就创建实例
private static final Singleton instance = new Singleton();
// 私有构造函数,防止外部实例化
private Singleton() {
}
// 静态方法返回单例实例
public static Singleton getInstance() {
return instance;
}
}
class SingletonTest {
public static void main(String[] args) {
//获取单例类的对象,因为对象私有,只能通过方法去获取
Singleton instance1 = Singleton.getInstance();
Singleton instance2 = Singleton.getInstance();
//判断是否为同一个对象
System.out.println("instance1和instance2的地址是否相同:" + instance1.equals(instance2));
}
}
测试结果:
1.2 静态代码块实现
核心方法:
public class Singleton {
// 声明实例变量
private static final Singleton instance;
// 使用静态代码块在类加载时初始化实例
static {
instance = new Singleton();
}
// 私有构造函数,防止外部实例化
private Singleton() {
}
// 静态方法返回单例实例
public static Singleton getInstance() {
return instance;
}
}
测试类:
public class Singleton {
// 声明实例变量