一看就懂的单例模式
前言
都知道单例模式在不被破坏的情况下, 全局只能实例化一次, 实现代码呢网上更多了, 也有好几种实现方式 ,恶汉,懒汉,双重检查. 但它在项目中怎么用呢? 其实很简单, 用gpt生成了一个案例, 一看就明白了.
单例的核心其实就在于只有一个实例, 全局都通过它来访问 ,那是不是就是说, 对于IO处理、数据库连接、配置文件解析加载等一些非常耗费系统资源的操作,我们就可以使用一个公用的实例,以节约系统开销,这种情况下就需要用到单例模式
正文
案例:
当然可以。这里有一个使用单例模式限制数据库连接创建的 Java 示例:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class SingletonDatabaseConnection {
// 私有化构造函数,防止外部实例化
private SingletonDatabaseConnection() {}
// 创建一个静态私有的变量来存储唯一的实例
private static volatile SingletonDatabaseConnection instance = null;
// 提供一个公共的静态方法获取实例,使用双重检查锁定(Double-Checked Locking)来保证线程安全
public static SingletonDatabaseConnection getInstance() {
if (instance == null) { // 第一次检查,避免不必要的同步开销
synchronized (SingletonDatabaseConnection.class) {
if (instance == null) { // 再次检查,在多线程环境下避免重复初始化
try {
Class.forName("com.mysql.jdbc.Driver"); // 加载驱动程序
Connection connection = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/mydatabase",
"username",
"password"
);
instance = new SingletonDatabaseConnection(connection);
} catch (ClassNotFoundException | SQLException e) {
throw new RuntimeException("Failed to create database connection", e);
}
}
}
}
return instance;
}
// 通过构造函数接收数据库连接,并将其存储在私有变量中
private final Connection connection;
private SingletonDatabaseConnection(Connection connection) {
this.connection = connection;
}
// 提供获取数据库连接的方法
public Connection getConnection() {
return connection;
}
// 在不使用时关闭数据库连接
public void closeConnection() throws SQLException {
if (connection != null && !connection.isClosed()) {
connection.close();
}
}
}
在这个例子中,SingletonDatabaseConnection
类只有一个实例,并且这个实例是在第一次调用 getInstance()
方法时创建的。这样就确保了在整个应用程序中,无论何时需要数据库连接,都只会创建一个连接,从而节约系统资源。
请注意,这只是一个简单的示例,实际应用中可能需要考虑更多的细节,例如错误处理、连接池管理等。