单例模式概述
单例模式(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() {
return instance;
}
}
3. 提供全局访问点
通过一个静态方法getInstance(),外部可以获取到类的唯一实例。
public class Singleton {
private static Singleton instance;
private Singleton() {
// 私有构造函数
}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
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;
}
}
实战案例
以下是一个使用单例模式实现的数据库连接池的示例:
public class DatabaseConnectionPool {
private static DatabaseConnectionPool instance;
private static final int MAX_CONNECTIONS = 10;
private List<Connection> connections = new ArrayList<>();
private DatabaseConnectionPool() {
// 初始化数据库连接
for (int i = 0; i < MAX_CONNECTIONS; i++) {
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "username", "password");
connections.add(connection);
}
}
public static DatabaseConnectionPool getInstance() {
if (instance == null) {
synchronized (DatabaseConnectionPool.class) {
if (instance == null) {
instance = new DatabaseConnectionPool();
}
}
}
return instance;
}
public Connection getConnection() {
if (connections.isEmpty()) {
throw new RuntimeException("No available connections");
}
return connections.remove(0);
}
public void releaseConnection(Connection connection) {
connections.add(connection);
}
}
在这个例子中,DatabaseConnectionPool类使用单例模式确保全局只有一个数据库连接池实例。通过getConnection()和releaseConnection()方法,可以获取和释放数据库连接。
总结
单例模式是一种简单而强大的设计模式,在面向对象编程中具有广泛的应用。通过理解单例模式的核心技术,我们可以更好地设计和实现具有唯一实例的类。在实际开发中,合理运用单例模式可以提高代码的可维护性和可扩展性。
