单例模式(Singleton Pattern)是设计模式中最常用的一种,它确保一个类只有一个实例,并提供一个全局访问点。在软件开发中,单例模式被广泛应用于各种场景,如数据库连接、文件操作、日志管理等。本文将深入探讨尚学堂单例模式的实战技巧与案例分析,帮助读者轻松掌握设计模式精髓。
单例模式的基本原理
单例模式的核心思想是控制对象的创建,确保全局只有一个实例。在Java中,实现单例模式通常有以下几种方式:
- 饿汉式:在类加载时就创建好单例对象。
- 懒汉式:在第一次使用时创建单例对象。
- 双重校验锁:懒汉式的一种改进,防止多线程环境下创建多个实例。
- 静态内部类:通过静态内部类来延迟加载单例对象。
实战技巧
饿汉式
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return INSTANCE;
}
}
饿汉式实现简单,但可能会浪费资源,因为实例在类加载时就已创建。
懒汉式
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
懒汉式在第一次使用时创建实例,但线程不安全,需要加锁。
双重校验锁
public class Singleton {
private static volatile Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
双重校验锁解决了懒汉式的线程安全问题,但代码复杂。
静态内部类
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton() {}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
静态内部类实现简单,且线程安全。
案例分析
以下是一个使用单例模式实现的数据库连接池案例:
public class DatabasePool {
private static final int MAX_CONNECTIONS = 10;
private static int currentConnections = 0;
private static List<Connection> connections = new ArrayList<>();
private DatabasePool() {}
public static Connection getConnection() {
if (currentConnections < MAX_CONNECTIONS) {
Connection connection = createNewConnection();
connections.add(connection);
currentConnections++;
return connection;
} else {
throw new RuntimeException("No available connections");
}
}
private static Connection createNewConnection() {
// 创建数据库连接
return new Connection();
}
}
在这个案例中,DatabasePool 类使用单例模式确保全局只有一个数据库连接池实例,从而提高数据库连接的复用率。
总结
单例模式是设计模式中的一种重要模式,通过控制对象的创建,确保全局只有一个实例。本文介绍了单例模式的基本原理、实战技巧和案例分析,帮助读者轻松掌握设计模式精髓。在实际开发中,选择合适的单例模式实现方式,可以提高代码的可维护性和可扩展性。
