一、单例模式代码实现
java
public class DatabaseConnection {
// 1. 私有静态实例变量
private static DatabaseConnection instance;
// 2. 私有构造函数,防止外部直接创建实例
private DatabaseConnection() {
// 初始化数据库连接
System.out.println("Database connection initialized.");
}
// 3. 公共静态方法,提供全局访问点
public static DatabaseConnection getInstance() {
if (instance == null) {
// 双重检查锁定,确保线程安全
synchronized (DatabaseConnection.class) {
if (instance == null) {
instance = new DatabaseConnection();
}
}
}
return instance;
}
// 4. 示例方法,模拟数据库操作
public void executeQuery(String query) {
System.out.println("Executing query: " + query);
}
}
二、日志管理器
场景描述
在一个大型系统中,日志记录是必不可少的。为了避免重复创建日志对象,我们可以使用单例模式来设计一个 日志管理器,统一管理日志的写入和输出。
代码实现
java
import java.io.FileWriter;
import java.io.IOException;
public class Logger {
// 1. 私有静态实例变量
private static Logger instance;
private FileWriter writer;
// 2. 私有构造函数,防止外部直接创建实例
private Logger() {
try {
// 初始化日志文件
writer = new FileWriter("app.log", true);
} catch (IOException e) {
e.printStackTrace();
}
}
// 3. 公共静态方法,提供全局访问点
public static synchronized Logger getInstance() {
if (instance == null) {
instance = new Logger();
}
return instance;
}
// 4. 日志记录方法
public void log(String message) {
try {
writer.write(message + "\n");
writer.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
// 5. 关闭日志文件
public void close() {
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
使用场景
java
public class Application {
public static void main(String[] args) {
// 获取日志管理器的单例实例
Logger logger = Logger.getInstance();
// 记录日志
logger.log("Application started.");
logger.log("User logged in: John Doe");
// 关闭日志文件
logger.close();
}
}
会在代码里直接生成一个app.log文件
三、配置管理器
场景描述
在项目中,通常需要读取配置文件(如 config.properties
)。为了避免重复加载配置文件,我们可以使用单例模式来设计一个 配置管理器,统一管理配置的读取和访问。
代码实现
java
import java.util.Properties;
import java.io.FileInputStream;
import java.io.IOException;
public class ConfigurationManager {
// 1. 私有静态实例变量
private static ConfigurationManager instance;
private Properties properties;
// 2. 私有构造函数,防止外部直接创建实例
private ConfigurationManager() {
properties = new Properties();
try {
// 加载配置文件
properties.load(new FileInputStream("config.properties"));
} catch (IOException e) {
e.printStackTrace();
}
}
// 3. 公共静态方法,提供全局访问点
public static synchronized ConfigurationManager getInstance() {
if (instance == null) {
instance = new ConfigurationManager();
}
return instance;
}
// 4. 获取配置项
public String getProperty(String key) {
return properties.getProperty(key);
}
}
使用场景
java
public class Application {
public static void main(String[] args) {
// 获取配置管理器的单例实例
ConfigurationManager configManager = ConfigurationManager.getInstance();
// 读取配置项
String dbUrl = configManager.getProperty("database.url");
String dbUser = configManager.getProperty("database.user");
System.out.println("Database URL: " + dbUrl);
System.out.println("Database User: " + dbUser);
}
}
四、线程池管理器(ThreadPool Manager)
场景描述
在多线程应用中,线程池是管理线程资源的常用方式。为了避免重复创建线程池,我们可以使用单例模式来设计一个 线程池管理器,统一管理线程池的创建和任务分配。
代码实现
java
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPoolManager {
// 1. 私有静态实例变量
private static ThreadPoolManager instance;
private ExecutorService threadPool;
// 2. 私有构造函数,防止外部直接创建实例
private ThreadPoolManager() {
// 初始化线程池(固定大小为 10)
threadPool = Executors.newFixedThreadPool(10);
}
// 3. 公共静态方法,提供全局访问点
public static synchronized ThreadPoolManager getInstance() {
if (instance == null) {
instance = new ThreadPoolManager();
}
return instance;
}
// 4. 提交任务到线程池
public void submitTask(Runnable task) {
threadPool.submit(task);
}
// 5. 关闭线程池
public void shutdown() {
threadPool.shutdown();
}
}
使用场景
java
public class Application {
public static void main(String[] args) {
// 获取线程池管理器的单例实例
ThreadPoolManager threadPoolManager = ThreadPoolManager.getInstance();
// 提交任务到线程池
for (int i = 0; i < 20; i++) {
threadPoolManager.submitTask(() -> {
System.out.println("Task executed by " + Thread.currentThread().getName());
});
}
// 关闭线程池
threadPoolManager.shutdown();
}
}
五、数据库连接池
场景描述
在高并发应用中,数据库连接池是管理数据库连接资源的常用方式。为了避免重复创建连接池,我们可以使用单例模式来设计一个 数据库连接池管理器,统一管理连接的获取和释放。
代码实现
java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class DatabaseConnectionPool {
// 1. 私有静态实例变量
private static DatabaseConnectionPool instance;
private List<Connection> connectionPool;
private static final int POOL_SIZE = 10;
// 2. 私有构造函数,防止外部直接创建实例
private DatabaseConnectionPool() {
connectionPool = new ArrayList<>();
try {
for (int i = 0; i < POOL_SIZE; i++) {
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "user", "password");
connectionPool.add(connection);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
// 3. 公共静态方法,提供全局访问点
public static synchronized DatabaseConnectionPool getInstance() {
if (instance == null) {
instance = new DatabaseConnectionPool();
}
return instance;
}
// 4. 获取数据库连接
public synchronized Connection getConnection() {
if (connectionPool.isEmpty()) {
throw new RuntimeException("No available connections in the pool.");
}
return connectionPool.remove(0);
}
// 5. 释放数据库连接
public synchronized void releaseConnection(Connection connection) {
connectionPool.add(connection);
}
}
使用场景
java
public class Application {
public static void main(String[] args) {
// 获取数据库连接池的单例实例
DatabaseConnectionPool connectionPool = DatabaseConnectionPool.getInstance();
// 获取连接
Connection connection = connectionPool.getConnection();
// 执行数据库操作
try {
// 模拟数据库操作
System.out.println("Executing query...");
} finally {
// 释放连接
connectionPool.releaseConnection(connection);
}
}
}
单例模式的核心思想是 确保一个类只有一个实例,并提供全局访问点,从而避免资源浪费和提高性能。