单例模式是软件设计模式中的一种经典模式,它保证了类在系统中只有一个实例存在,同时提供了全局访问点。这种模式常用于系统配置、数据库连接、缓存管理等场景,以减少资源消耗并确保一致性。
单例模式的核心在于限制类的实例化过程,通常通过私有化构造函数和静态方法来实现。下面我们将详细讨论单例模式的实现方式、UML图表示以及其在实际应用中的价值。
### 单例模式的实现
#### 1. 饿汉式(静态常量)
```java
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return INSTANCE;
}
}
```
这种实现方式在类加载时就创建了单例对象,线程安全,但由于提前初始化,可能会浪费资源。
#### 2. 饿汉式(静态代码块)
与静态常量类似,但在类加载时执行初始化,线程安全,资源利用率略高于前者。
#### 3. 懒汉式(线程不安全)
```java
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
```
这种实现方式延迟了实例化,但不是线程安全的,在多线程环境下可能导致多个实例。
#### 4. 懒汉式(线程安全 - 同步方法)
```java
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
```
通过同步关键字解决了线程安全问题,但同步方法降低了效率。
#### 5. 双重检查锁定(DCL)
```java
public class Singleton {
private volatile static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
```
DCL结合了延迟初始化和线程安全,性能较好。
#### 6. 静态内部类
```java
public class Singleton {
private Singleton() {}
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
```
这种方式利用Java类加载机制保证线程安全,延迟初始化且无需同步。
### UML类图表示
单例模式的UML类图中,类`Singleton`有一个公有的静态方法`getInstance()`,没有公有的构造函数。为了表示单例,可以在类名上添加一个注解`@Singleton`或使用特殊的符号(例如,一个斜线`/`)来表示该类只能实例化一次。
### 应用价值
1. 资源共享:在系统中只需要一个实例的情况下,单例模式可以避免资源的浪费。
2. 控制访问:通过提供全局访问点,控制对特定对象的访问。
3. 在需要跨层通信的场景下,单例作为桥梁,简化通信过程。
4. 用于系统级别的日志记录、缓存管理、线程池、数据库连接池等。
以上就是关于单例模式的详细说明,包括常见的实现方式、UML图表示及其应用价值。了解和熟练掌握单例模式对于编写高效、稳定的代码具有重要意义。