工厂模式、观察者模式 C++举例
时间: 2024-10-02 08:04:38 浏览: 16
工厂模式(Factory Pattern)是一种设计模式,它提供了一种创建对象的最佳方式,而不必暴露其内部的创建逻辑。这种方式使得客户端只需关心使用,无需关心如何创建。例如,在C++中,可以创建一个抽象工厂类,然后为每一种具体的对象类型定义一个对应的工厂函数:
```cpp
class Shape {
public:
virtual ~Shape() {}
virtual void draw() = 0;
};
class Circle : public Shape {
public:
void draw() override { std::cout << "Drawing a circle" << std::endl; }
};
class Square : public Shape {
public:
void draw() override { std::cout << "Drawing a square" << std::endl; }
};
// 抽象工厂类
class Factory {
public:
virtual Shape* createShape(const std::string& type) = 0;
};
// 具体工厂实现
class CircleFactory : public Factory {
public:
Shape* createShape(const std::string& type) override {
if (type == "circle") {
return new Circle();
}
return nullptr;
}
};
int main() {
Factory* factory = new CircleFactory(); // 根据需要选择特定工厂
Shape* shape = factory->createShape("circle");
shape->draw(); // 输出: Drawing a circle
delete factory;
delete shape;
return 0;
}
```
观察者模式(Observer Pattern),也叫发布-订阅模式,当主题(Subject)的状态发生改变时,所有依赖于它的观察者(Observer)都会得到通知并自动更新。在C++中,可以使用`std::function`和智能指针(如`std::weak_ptr`)来实现简单版本的观察者模式:
```cpp
#include <functional>
class Subject {
private:
std::vector<std::shared_ptr<Observer>> observers_;
std::function<void()> notify_;
public:
void attach(Observer& observer) {
observers_.push_back(std::make_shared<Observer>(&observer));
}
void detach(Observer& observer) {
for (auto it = observers_.begin(); it != observers_.end(); ++it) {
if (*it == observer) {
observers_.erase(it);
break;
}
}
}
void notify() {
if (!notify_) return;
for (const auto& observer : observers_) {
observer->update();
}
}
};
class Observer {
public:
virtual void update() = 0;
};
class ConcreteObserver : public Observer {
public:
void update() override {
std::cout << "Observer notified." << std::endl;
}
};
int main() {
Subject subject;
ConcreteObserver observer;
subject.attach(observer);
subject.notify(); // 输出: Observer notified.
subject.detach(observer); // 移除观察者
subject.notify(); // 此时不再通知
return 0;
}
```
阅读全文