嵌入式大厂面经 C++设计模式常考面试题(持续更新中!)
这是一个嵌入式大厂面试题专栏,每天更新高频面试题。专栏将包含题目描述、详细解析、相关知识点扩展以及实际代码示例。内容涵盖操作系统、驱动开发、通信协议等核心领域,并结合实际项目经验进行分析。每道题目都会附带面试官可能的追问方向,帮助大家更好地准备面试!
来源:牛客网C++中设计模式常见面试题
设计模式是软件开发中解决特定问题的经典方案,在C++面试中经常会被问到。以下是一些常见的C++设计模式面试题及其解答:
1. 单例模式 (Singleton Pattern)
基本概念
单例模式确保一个类只有一个实例,并提供一个全局访问点。
面试题:如何实现线程安全的单例模式?
// 懒汉式(线程安全,使用双检锁)
class Singleton {
private:
static Singleton* instance;
static std::mutex mutex_;
// 私有构造函数
Singleton() {}
// 禁止拷贝和赋值
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
public:
static Singleton* getInstance() {
if (instance == nullptr) { // 第一次检查
std::lock_guard<std::mutex> lock(mutex_);
if (instance == nullptr) { // 第二次检查
instance = new Singleton();
}
}
return instance;
}
};
// 静态成员初始化
Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mutex_;
// 更现代的实现:Meyers' Singleton (C++11)
class Singleton {
private:
Singleton() {}
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
public:
static Singleton& getInstance() {
static Singleton instance; // C++11保证线程安全的初始化
return instance;
}
};
相关问题
- 单例模式有哪些实现方式?懒汉式:第一次使用时初始化饿汉式:程序启动时初始化Meyers' Singleton:利用C++11的静态局部变量初始化特性
- 单例模式的优缺点是什么?优点:控制实例数量,节省资源,提供全局访问点缺点:隐藏依赖关系,违反单一职责原则,不易测试
2. 工厂模式 (Factory Pattern)
基本概念
工厂模式提供一个创建对象的接口,让子类决定实例化哪个类。
面试题:实现一个简单工厂和工厂方法模式
// 产品基类
class Product {
public:
virtual ~Product() {}
virtual void operation() = 0;
};
// 具体产品A
class ConcreteProductA : public Product {
public:
void operation() override {
std::cout << "ConcreteProductA operation" << std::endl;
}
};
// 具体产品B
class ConcreteProductB : public Product {
public:
void operation() override {
std::cout << "ConcreteProductB operation" << std::endl;
}
};
// 简单工厂
class SimpleFactory {
public:
static Product* createProduct(const std::string& type) {
if (type == "A") {
return new ConcreteProductA();
} else if (type == "B") {
return new ConcreteProductB();
}
return nullptr;
}
};
// 工厂方法模式 - 工厂基类
class Factory {
public:
virtual ~Factory() {}
virtual Product* createProduct() = 0;
};
// 具体工厂A
class ConcreteFactoryA : public Factory {
public:
Product* createProduct() override {
return new ConcreteProductA();
}
};
// 具体工厂B
class ConcreteFactoryB : public Factory {
public:
Product* createProduct() override {
return new ConcreteProductB();
}
};
相关问题
- 简单工厂、工厂方法和抽象工厂的区别是什么?简单工厂:一个工厂创建不同产品工厂方法:不同工厂创建不同产品,但每个工厂只创建一种产品抽象工厂:不同工厂创建不同产品族
- 工厂模式的优缺点是什么?优点:封装创建逻辑,降低耦合,符合开闭原则缺点:增加系统复杂度,需要引入更多类
3. 观察者模式 (Observer Pattern)
基本概念
观察者模式定义了对象间的一对多依赖关系,当一个对象状态改变时,所有依赖它的对象都会得到通知。
面试题:实现一个观察者模式
// 观察者接口
class Observer {
public:
virtual ~Observer() {}
virtual void update(const std::string& message) = 0;
};
// 具体观察者
class ConcreteObserver : public Observer {
private:
std::string name_;
public:
ConcreteObserver(const std::string& name) : name_(name) {}
void update(const std::string& message) override {
std::cout << name_ << " received: " << message << std::endl;
}
};
// 主题接口
class Subject {
public:
virtual ~Subject() {}
virtual void attach(Observer* observer) = 0;
virtual void detach(Observer* observer) = 0;
virtual void notify(const std::string& message) = 0;
};
// 具体主题
class ConcreteSubject : public Subject {
private:
std::vector<Observer*> observers_;
public:
void attach(Observer* observer) override {
observers_.push_back(observer);
}
void detach(Observer* observer) override {
auto it = std::find(observers_.begin(), observers_.end(), observer);
if (it != observers_.end()) {
observers_.erase(it);
}
}
void notify(const std::string& message) override {
for (auto observer : observers_) {
observer->update(message);
}
}
};
相关问题
- 观察者模式与发布-订阅模式的区别是什么?观察者模式:观察者直接订阅主题,主题直接通知观察者发布-订阅模式:发布者和订阅者之间有一个中间层(事件通道)
- 观察者模式的应用场景有哪些?GUI事件处理消息通知系统数据变化监听
4. 装饰器模式 (Decorator Pattern)
基本概念
装饰器模式动态地给对象添加额外的职责,比继承更灵活。
面试题:实现一个装饰器模式
// 组件接口
class Component {
public:
virtual ~Component() {}
virtual void operation() = 0;
};
// 具体组件
class ConcreteComponent : public Component {
public:
void operation() override {
std::cout << "ConcreteComponent operation" << std::endl;
}
};
// 装饰器基类
class Decorator : public Component {
protected:
Component* component_;
public:
Decorator(Component* component) : component_(component) {}
void operation() override {
if (component_) {
component_->operation();
}
}
};
// 具体装饰器A
class ConcreteDecoratorA : public Decorator {
public:
ConcreteDecoratorA(Component* component) : Decorator(component) {}
void operation() override {
Decorator::operation();
addedBehavior();
}
private:
void addedBehavior() {
std::cout
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
嵌入式面试八股文全集 文章被收录于专栏
这是一个全面的嵌入式面试专栏。主要内容将包括:操作系统(进程管理、内存管理、文件系统等)、嵌入式系统(启动流程、驱动开发、中断管理等)、网络通信(TCP/IP协议栈、Socket编程等)、开发工具(交叉编译、调试工具等)以及实际项目经验分享。专栏将采用理论结合实践的方式,每个知识点都会附带相关的面试真题和答案解析。
SHEIN希音公司福利 370人发布