设计模式是软件开发中常用的解决方案,它们提供了一些经过验证的方法来解决常见的设计问题。以下是单例模式、工厂模式和观察者模式在C++中的实现和应用场景的详细讲解。
1. 单例模式(Singleton Pattern)
概念
单例模式确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。这对于管理全局状态、配置对象、日志记录对象等非常有用。
实现
在C++中实现单例模式通常涉及以下步骤:
- 私有化构造函数、复制构造函数和赋值操作符,防止外部创建对象。
- 提供一个静态方法来获取类的唯一实例。
#include <iostream> #include <mutex> class Singleton { public: // 获取单例实例的静态方法 static Singleton& getInstance() { static Singleton instance; // 使用静态局部变量确保唯一实例 return instance; } // 示例方法 void showMessage() { std::cout << "Hello from Singleton!" << std::endl; } // 删除复制构造函数和赋值操作符,防止复制 Singleton(const Singleton&) = delete; Singleton& operator=(const Singleton&) = delete; private: // 私有构造函数,防止外部实例化 Singleton() { std::cout << "Singleton Constructor Called" << std::endl; } }; int main() { Singleton& instance1 = Singleton::getInstance(); Singleton& instance2 = Singleton::getInstance(); instance1.showMessage(); if (&instance1 == &instance2) { std::cout << "Both instances are the same." << std::endl; } return 0; }
应用场景
- 配置管理: 全局共享的配置管理器。
- 日志系统: 统一的日志记录类,用于在整个应用程序中收集日志。
- 资源管理: 控制对全局共享资源的唯一访问点,比如数据库连接池。
2. 工厂模式(Factory Pattern)
概念
工厂模式通过定义一个创建对象的接口,让子类决定实例化哪个类。工厂模式使一个类的实例化过程延迟到子类。
工厂模式包括以下几种常见变体:
- 简单工厂模式(Simple Factory Pattern): 提供一个方法来创建对象。
- 工厂方法模式(Factory Method Pattern): 定义一个接口来创建对象,由子类来决定实例化哪个具体的类。
- 抽象工厂模式(Abstract Factory Pattern): 提供一个接口来创建一系列相关或依赖的对象,而不需要指定它们的具体类。
实现
下面是一个简单工厂模式的示例,用于创建不同类型的产品对象:
#include <iostream>
#include <memory>
// 产品基类
class Product {
public:
virtual void show() = 0;
virtual ~Product() = default;
};
// 具体产品类 A
class ConcreteProductA : public Product {
public:
void show() override {
std::cout << "ConcreteProductA created." << std::endl;
}
};
// 具体产品类 B
class ConcreteProductB : public Product {
public:
void show() override {
std::cout << "ConcreteProductB created." << std::endl;
}
};
// 简单工厂类
class SimpleFactory {
public:
enum ProductType { PRODUCT_A, PRODUCT_B };
static std::unique_ptr<Product> createProduct(ProductType type) {
switch (type) {
case PRODUCT_A:
return std::make_unique<ConcreteProductA>();
case PRODUCT_B:
return std::make_unique<ConcreteProductB>();
default:
return nullptr;
}
}
};
int main() {
auto productA = SimpleFactory::createProduct(SimpleFactory::PRODUCT_A);
auto productB = SimpleFactory::createProduct(SimpleFactory::PRODUCT_B);
productA->show();
productB->show();
return 0;
}
应用场景
- 对象创建逻辑复杂: 当对象创建的逻辑非常复杂且可能涉及多个步骤时,工厂模式可以隐藏这些细节。
- 解耦: 工厂模式可以将客户端与具体的类解耦,使得更容易扩展和维护。
- 动态实例化: 根据运行时条件动态决定创建哪个类的实例。
3. 观察者模式(Observer Pattern)
概念
观察者模式定义了一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都会自动收到通知并更新。它用于实现对象间的解耦通信。
实现
在C++中,实现观察者模式通常涉及以下组件:
- 主体(Subject): 被观察的对象,它维护一个观察者列表,并在状态改变时通知它们。
- 观察者(Observer): 接受通知并作出相应反应的对象。
#include <iostream> #include <vector> #include <memory> // 观察者接口 class Observer { public: virtual void update(int state) = 0; virtual ~Observer() = default; }; // 具体观察者 class ConcreteObserver : public Observer { public: void update(int state) override { std::cout << "Observer updated with state: " << state << std::endl; } }; // 主体(被观察者) class Subject { public: void addObserver(std::shared_ptr<Observer> observer) { observers.push_back(observer); } void setState(int newState) { state = newState; notifyObservers(); } private: void notifyObservers() { for (const auto& observer : observers) { observer->update(state); } } std::vector<std::shared_ptr<Observer>> observers; int state; }; int main() { std::shared_ptr<Observer> observer1 = std::make_shared<ConcreteObserver>(); std::shared_ptr<Observer> observer2 = std::make_shared<ConcreteObserver>(); Subject subject; subject.addObserver(observer1); subject.addObserver(observer2); subject.setState(10); subject.setState(20); return 0; }
应用场景
- 事件处理系统: 当事件发生时,通知所有感兴趣的对象(例如 GUI 框架中的事件处理)。
- 订阅发布系统: 允许多个对象订阅一个主题,当主题有更新时,所有订阅者都会收到通知。
- 模型-视图-控制器(MVC)架构: 在MVC中,视图对象可以观察模型对象,当模型数据改变时,视图会自动更新。这些模式都是非常实用的工具,可以帮助开发者编写更灵活、可扩展和可维护的代码。
总结
单例模式用于确保一个类只有一个实例,适合管理全局状态或资源。
工厂模式用于创建对象,适合对象创建逻辑复杂或需要解耦的场景。
这些模式都是非常实用的工具,可以帮助开发者编写更灵活、可扩展和可维护的代码。
观察者模式用于在对象之间建立一对多的依赖关系,适合事件通知或数据同步的场景。
标签:std,对象,观察者,C++,实例,模式,单例 From: https://blog.csdn.net/qq_44905692/article/details/140172425