上传者: jinghaiyintc
|
上传时间: 2025-11-13 21:36:27
|
文件大小: 1.44MB
|
文件类型: PPT
单例模式是一种设计模式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。在软件工程中,这种模式常用于控制共享资源的访问,比如配置信息类、数据库连接池管理等。
单例模式的名称是“Singleton”,来源于英文单词“单一”。在Java语言中,实现单例模式主要有三种方式:
1. **饿汉式**(Eager Initialization):这是最简单的实现方式,类加载时就创建了单例实例。这样保证了线程安全,但可能会造成资源浪费,因为无论是否使用,都会在类加载时创建对象。实现代码通常是将构造函数私有化,然后创建一个静态的类成员实例。
```java
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return INSTANCE;
}
}
```
2. **懒汉式**(Lazy Initialization):在类被加载后,直到首次调用getInstance方法时才创建实例。这种方式延迟了实例化的时间,但如果不加同步控制,在多线程环境下可能导致多个实例。为了解决这个问题,可以使用synchronized关键字修饰getInstance方法。
```java
public class Singleton {
private static Singleton theInstance = null;
private Singleton() {}
public synchronized static Singleton getInstance() {
if (theInstance == null) {
theInstance = new Singleton();
}
return theInstance;
}
}
```
3. **登记式**(Registry,又称双重检查锁定):结合了前两种方式的优点,既延迟了实例化,又保证了线程安全。它在初始化实例时会进行两次检查,第一次是在类加载时,第二次是在同步块内,以避免不必要的同步开销。
```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;
}
}
```
登记式单例还有一种变体,通过`Class.forName().newInstance()`的方式实现,利用了类加载器的特性来保证单例,这在某些特定场景下可能更为适用。
每种实现方式都有其优缺点。饿汉式简单高效,但可能会造成资源浪费;懒汉式延迟初始化,节省资源,但需处理多线程问题;登记式则在延迟初始化和线程安全之间找到了平衡,但代码相对复杂。此外,登记式单例模式的一个优点是它可以被子类化,而饿汉式和懒汉式单例通常不支持。
在实际应用中,单例模式常见于以下场合:
- **配置信息类**:如XML配置文件的解析,只创建一个解析器实例来读取和管理配置信息。
- **数据库连接池控制类**:管理数据库连接,通过单例确保所有请求都使用同一组连接,提高性能并减少资源消耗。
- **Web应用中的控制类**:如Struts框架的ActionServlet,通过web.xml配置,由容器(如Tomcat)在启动时创建一个全局实例,处理所有请求。
总结来说,单例模式是设计模式的一种,它的核心是限制类的实例化次数为一次,以达到控制共享资源的目的。Java中有多种实现方式,包括饿汉式、懒汉式和登记式,它们在实现细节和性能上有差异,适用于不同的应用场景。理解并熟练运用这些实现方式,可以帮助我们编写出更高效、更可靠的代码。