面试题答案
一键面试- 单例模式
- 设计思路:使用单例模式封装全局变量。创建一个类,将全局变量作为类的成员变量,通过静态成员函数提供唯一的实例访问接口。例如:
class GlobalData {
private:
static GlobalData* instance;
int globalVar;
// 构造函数私有化,防止外部直接创建对象
GlobalData() : globalVar(0) {}
// 禁止拷贝构造和赋值运算符
GlobalData(const GlobalData&) = delete;
GlobalData& operator=(const GlobalData&) = delete;
public:
static GlobalData* getInstance() {
if (instance == nullptr) {
instance = new GlobalData();
}
return instance;
}
int getGlobalVar() const {
return globalVar;
}
void setGlobalVar(int value) {
globalVar = value;
}
};
GlobalData* GlobalData::instance = nullptr;
- **优点**:实现了全局变量的封装,各个模块通过单例实例访问数据,减少了直接依赖全局变量导致的耦合。并且在项目迭代中,若要对全局变量进行修改或添加新的变量,只需在单例类中进行修改,维护和扩展相对方便。
2. 命名空间隔离 - 设计思路:将相关的全局变量封装在特定的命名空间中,并为命名空间提供访问接口函数。例如:
namespace GlobalNamespace {
int globalValue;
void initGlobalValue(int value) {
globalValue = value;
}
int getGlobalValue() {
return globalValue;
}
}
- **优点**:通过命名空间实现了一定程度的封装,不同模块使用命名空间中的接口函数访问全局变量,避免了全局变量的直接暴露,减少耦合。在项目扩展时,可以在命名空间内添加新的全局变量和相关接口函数,便于维护。
3. 依赖注入 - 设计思路:在模块的接口中,通过参数传递的方式提供所需的全局数据,而不是让模块直接依赖全局变量。例如:
class Module {
public:
void process(const GlobalData& globalData) {
int data = globalData.getGlobalVar();
// 处理逻辑
}
};
- **优点**:模块与全局变量的耦合度降低,模块仅依赖传入的数据,而不是直接依赖全局变量。在项目迭代时,若全局变量发生变化,只需修改调用模块的地方,将新的全局数据传递进去,对模块内部影响较小,方便维护和扩展。
4. 分层架构 - 设计思路:将项目分为不同的层次,如数据层、业务逻辑层、表示层等。将全局变量相关的操作封装在数据层,业务逻辑层和表示层通过数据层提供的接口访问全局数据。例如:
// 数据层
class DataLayer {
public:
int getGlobalData() {
// 获取全局变量逻辑
return globalVar;
}
private:
int globalVar;
};
// 业务逻辑层
class BusinessLogic {
public:
void doBusiness(DataLayer& dataLayer) {
int data = dataLayer.getGlobalData();
// 业务处理
}
};
- **优点**:不同层次职责明确,全局变量的封装和管理集中在数据层,减少了不同模块之间因全局变量产生的耦合。在项目迭代时,对全局变量的维护和扩展主要集中在数据层,不会影响到其他层次的核心逻辑,便于维护和扩展。