单例模式概述
单例模式(Singleton Pattern)是一种常用的软件设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。单例模式主要应用于以下场景:
- 需要控制实例的数量,确保全局只有一个实例。
- 实例化开销较大,且只要求有一个实例时。
- 系统中某些类需要被共享使用,而不是每次都重新创建。
单例模式的核心技术
1. 私有构造函数
单例模式要求类的构造函数为私有,防止外部通过new关键字创建多个实例。
public class Singleton {
private static Singleton instance;
private Singleton() {
// 私有构造函数
}
}
2. 静态方法获取实例
为了获取单例实例,我们通常提供一个静态方法,该方法负责创建并返回单例实例。
public class Singleton {
private static Singleton instance;
private Singleton() {
// 私有构造函数
}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
3. 懒汉式与饿汉式
根据实例化时机,单例模式分为懒汉式和饿汉式。
懒汉式
懒汉式单例在第一次调用getInstance()方法时创建实例,实现延迟加载。
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 final Singleton instance = new Singleton();
private Singleton() {
// 私有构造函数
}
public static Singleton getInstance() {
return instance;
}
}
4. 多线程安全
在多线程环境下,单例模式需要保证线程安全。懒汉式单例在多线程环境下可能出现多个实例,因此需要添加同步机制。
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;
}
}
5. 静态内部类
静态内部类单例模式通过静态内部类实现单例,确保线程安全,同时延迟加载。
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton() {
// 私有构造函数
}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
单例模式的实战应用
1. 数据库连接池
数据库连接池是一种常用的单例模式应用,它确保数据库连接的唯一性和复用性。
public class DatabaseConnectionPool {
private static final int MAX_CONNECTIONS = 10;
private static final List<Connection> connections = new ArrayList<>();
private DatabaseConnectionPool() {
// 初始化连接池
for (int i = 0; i < MAX_CONNECTIONS; i++) {
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db", "username", "password");
connections.add(connection);
}
}
public static Connection getConnection() {
if (connections.isEmpty()) {
return null;
}
return connections.remove(connections.size() - 1);
}
public static void releaseConnection(Connection connection) {
connections.add(connection);
}
}
2. 日志记录器
日志记录器是一种常见的单例模式应用,它确保全局只有一个日志记录器实例。
public class Logger {
private static final Logger instance = new Logger();
private Logger() {
// 初始化日志记录器
}
public void log(String message) {
// 记录日志
}
}
总结
单例模式是一种简单实用的设计模式,在许多场景下都有广泛的应用。通过本文的解析,相信读者已经对单例模式有了深入的了解。在实际应用中,应根据具体需求选择合适的单例模式实现方式。
