单例模式Java代码实现教程
引言
在软件开发中,单例模式是一种常用的设计模式,它属于创建型模式,通过保证一个类只有一个实例,来提供对该实例的全局访问。在Java中,实现单例模式有多种方式,本教程将介绍其中最常用的几种方式。
整体流程
下面是实现单例模式的整体流程:
gantt
dateFormat YYYY-MM-DD
title 实现单例模式的步骤
section 创建一个类
创建类对象 : a1, 2022-01-01, 1d
section 定义构造函数
定义私有构造函数 : a2, 2022-01-02, 1d
section 提供静态方法
定义静态方法获取实例 : a3, 2022-01-03, 1d
section 添加线程安全措施
使用双重检查锁定 : a4, 2022-01-04, 1d
section 使用单例类
调用静态方法获取实例 : a5, 2022-01-05, 1d
步骤详解
步骤一:创建一个类
首先,我们需要创建一个类作为单例类。这个类只能有一个实例,所以我们需要将其构造函数定义为私有的,以防止其他类直接实例化它。
public class Singleton {
// 私有构造函数,防止其他类实例化
private Singleton() {
}
}
步骤二:定义构造函数
接下来,我们需要定义一个私有的构造函数,以确保该类不能被直接实例化。这样可以防止其他类通过创建新对象来绕过单例的限制。
public class Singleton {
// 私有构造函数,防止其他类实例化
private Singleton() {
}
}
步骤三:提供静态方法
为了获取单例类的唯一实例,我们需要提供一个静态方法。这个静态方法将返回单例类的实例。在方法内部,我们需要检查实例是否已经存在,如果不存在则创建一个新的实例。
public class Singleton {
// 私有构造函数,防止其他类实例化
private Singleton() {
}
// 静态方法获取实例
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
步骤四:添加线程安全措施
上述实现方式存在线程安全问题,即多个线程可能并发访问到instance为null的情况,导致多次创建实例。为了解决这个问题,我们可以使用双重检查锁定机制,即在方法内部进行线程同步,并在判断实例是否为空的时候再进行一次检查。
public class Singleton {
// 私有构造函数,防止其他类实例化
private Singleton() {
}
// 静态变量,保存唯一实例
private static volatile Singleton instance;
// 静态方法获取实例
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
步骤五:使用单例类
现在,我们已经完成了单例类的实现。我们可以通过调用静态方法getInstance
来获取单例类的实例。
public class Main {
public static void main(String[] args) {
Singleton singleton = Singleton.getInstance();
// 使用单例类
}
}
状态图
下面是单例模式的状态图表示:
stateDiagram
[*] --> 创建类对象
创建类对象 --> 定义构造函数
定义构造函数 --> 提供静态方法
提供静态方法 --> 添加线程安全措施
添加线程安全措施 --> 使用单例类