单例模式使用场景:
当我们考虑单例模式时,可以将其类比为某种资源或服务,这种资源或服务在整个应用程序中只需一个实例即可满足需求。下面以一个简单的日志记录器为例来解释什么情况下使用饿汉模式,什么情况下使用懒汉模式。
适合使用饿汉模式的场景:
实际例子: 假设我们有一个日志记录器,它负责在应用程序中记录各种信息,如错误日志、警告信息等。这个日志记录器在应用程序运行期间始终只需要一个实例,而且创建实例的成本较低。
java 代码实例:
public class Logger {
// 在类加载时就创建实例并初始化
private static final Logger instance = new Logger();
// 私有构造方法,避免类在外部被实例化
private Logger() {}
// 提供一个获取实例的静态方法
public static Logger getInstance() {
return instance;
}
// 记录日志的方法
public void log(String message) {
System.out.println("Log: " + message);
}
// 其他日志相关方法...
}
在这个例子中,我们使用饿汉模式创建了一个日志记录器的单例实例。因为日志记录器的创建成本较低,而且在应用程序运行期间始终需要一个实例,所以在应用程序启动时就创建实例是合理的。
适合使用懒汉模式的场景:
实际例子: 假设我们有一个连接数据库的管理器,它负责在需要时创建数据库连接,并提供给应用程序使用。这个数据库连接管理器在应用程序中只需要一个实例,但是创建数据库连接的成本较高。
Java代码示例:
public class DbConnectionManager {
// 声明一个私有静态变量来保存实例
private static DbConnectionManager instance;
// 私有构造方法,避免类在外部被实例化
private DbConnectionManager() {}
// 提供一个获取实例的静态方法
public static synchronized DbConnectionManager getInstance() {
// 如果实例为空,则创建实例
if (instance == null) {
instance = new DbConnectionManager();
}
return instance;
}
// 获取数据库连接的方法
public Connection getConnection() {
// 实现获取数据库连接的逻辑...
return null; // 假设返回数据库连接对象
}
// 其他数据库连接管理方法...
}
在这个例子中,我们使用懒汉模式创建了一个数据库连接管理器的单例实例。因为创建数据库连接的成本较高,并不是每次启动应用程序都会立即使用到数据库连接,所以延迟到需要时才创建实例是合理的。