面试题答案
一键面试1. 设计单例类
使用饿汉式单例模式,确保在类加载时就创建单例实例,避免多线程环境下的同步问题,提高效率。
public class ResourceManager {
// 私有静态实例,在类加载时就初始化
private static final ResourceManager instance = new ResourceManager();
// 数据库连接池
private DatabaseConnectionPool dbPool;
// 文件缓存
private FileCache fileCache;
// 私有构造函数,防止外部实例化
private ResourceManager() {
// 这里可以进行资源的初始化
}
// 提供静态方法获取单例实例
public static ResourceManager getInstance() {
return instance;
}
// 获取数据库连接池的方法
public DatabaseConnectionPool getDatabaseConnectionPool() {
if (dbPool == null) {
dbPool = new DatabaseConnectionPool();
}
return dbPool;
}
// 获取文件缓存的方法
public FileCache getFileCache() {
if (fileCache == null) {
fileCache = new FileCache();
}
return fileCache;
}
}
2. 处理资源初始化顺序
- 按需初始化:如上述代码,在获取资源方法中,采用懒加载方式,当第一次调用获取资源方法时才进行初始化。这样可以避免一开始就初始化所有资源,节省系统资源和启动时间。
- 手动初始化:如果有特定的初始化顺序要求,可以在单例类的构造函数中按照顺序进行初始化。例如:
private ResourceManager() {
dbPool = new DatabaseConnectionPool();
fileCache = new FileCache(dbPool); // 文件缓存依赖数据库连接池
}
3. 处理依赖关系
- 构造函数注入:在需要依赖其他资源的类的构造函数中传入所依赖的资源实例。例如,假设
FileCache
依赖DatabaseConnectionPool
,则FileCache
类可以这样设计:
public class FileCache {
private DatabaseConnectionPool dbPool;
public FileCache(DatabaseConnectionPool dbPool) {
this.dbPool = dbPool;
}
}
- Setter方法注入:也可以通过Setter方法来设置依赖关系,灵活性更高。例如:
public class FileCache {
private DatabaseConnectionPool dbPool;
public void setDatabaseConnectionPool(DatabaseConnectionPool dbPool) {
this.dbPool = dbPool;
}
}
在单例类ResourceManager
中获取FileCache
时,可以先获取DatabaseConnectionPool
,再通过setDatabaseConnectionPool
方法设置依赖:
public FileCache getFileCache() {
if (fileCache == null) {
fileCache = new FileCache();
fileCache.setDatabaseConnectionPool(getDatabaseConnectionPool());
}
return fileCache;
}
其他语言示例(Python)
class ResourceManager:
_instance = None
def __new__(cls):
if cls._instance is None:
cls._instance = super().__new__(cls)
cls._instance.init_resources()
return cls._instance
def init_resources(self):
self.db_pool = DatabaseConnectionPool()
self.file_cache = FileCache(self.db_pool)
class DatabaseConnectionPool:
pass
class FileCache:
def __init__(self, db_pool):
self.db_pool = db_pool
在Python中,使用__new__
方法实现单例,在init_resources
方法中处理资源初始化顺序和依赖关系。