C++:设计模式

一、单例模式(Singleton Pattern)

核心思想:确保一个类只有一个实例,并提供全局访问点。
适用场景:需要全局唯一对象的场景,如配置管理、数据库连接池、日志管理器等。
实现方式:
  1. 私有构造函数:禁止外部直接实例化。
  2. 静态成员变量:保存唯一实例。
  3. 静态方法(如getInstance):提供全局访问入口。
代码示例(线程安全懒汉式,C++):
class Singleton {
private:
    static Singleton* instance;
    Singleton() {} // 私有构造函数
public:
    static Singleton* getInstance() {
        if (instance == nullptr) {
            instance = new Singleton();
        }
        return instance;
    }
};
优缺点:
  • ✅ 节省资源,避免重复创建对象。
  • ❌ 可能引入全局状态,需注意线程安全。

二、工厂模式(Factory Pattern)

核心思想:将对象的创建逻辑封装在工厂类中,客户端无需关心具体实现。
常见变体
  1. 简单工厂:一个工厂类根据参数创建不同对象。
  2. 工厂方法:定义创建对象的接口,由子类决定实例化哪个类。
  3. 抽象工厂:创建一组相关或依赖对象的家族。
适用场景:需要解耦对象创建和使用时,如数据库驱动、UI 组件库等。
代码示例:
#include <iostream>
#include <string>
using namespace std;
// 基类(抽象接口)
class Animal {
public:
    virtual string speak() = 0;
    virtual ~Animal() = default; // 虚析构函数
};
// 派生类 Dog
class Dog : public Animal {
public:
    string speak() override { return "Woof!"; }
};
// 派生类 Cat
class Cat : public Animal {
public:
    string speak() override { return "Meow!"; }
};
// 工厂类
class AnimalFactory {
public:
    static Animal* create(const string& type) {
        if (type == "dog") return new Dog();
        if (type == "cat") return new Cat();
    }
};
// 使用示例
int main() {
    Animal* dog = AnimalFactory::create("dog");
    Animal* cat = AnimalFactory::create("cat");
    
    cout << dog->speak() << "\n"; // 输出: Woof!
    cout << cat->speak() << "\n"; // 输出: Meow!
    
    delete dog; // 实际建议用智能指针
    delete cat;
    return 0;
}
优缺点
  • ✅ 客户端与具体类解耦,扩展性强。
  • ❌ 新增类型需修改工厂逻辑(可通过反射优化)。

三、观察者模式(Observer Pattern)

核心思想:定义对象间的一对多依赖关系,当一个对象(主题)状态变化时,自动通知所有依赖它的观察者。
适用场景:事件驱动系统、GUI 组件交互、消息通知等。
关键角色:
  1. Subject(主题):维护观察者列表,提供注册/注销接口。
  2. Observer(观察者):定义更新方法(如update)。
代码示例:
#include <iostream>
#include <vector>
using namespace std;
// 主题(被观察者)
class Subject {
public:
    vector<class Observer*> observers; // 直接公开观察者列表(简化版)
    void notify(const string& msg) {
        for (auto* o : observers) o->update(msg); // 直接调用观察者的 update
    }
};

// 观察者
class Observer {
public:
    virtual void update(const string& msg) = 0;
};

// 具体观察者
class User : public Observer {
public:
    void update(const string& msg) override { 
        cout << "[User] " << msg << "\n"; 
    }
};

// 使用示例
int main() {
    Subject subject;
    User user1, user2;

    subject.observers.push_back(&user1); // 直接添加观察者(省去 addObserver 方法)
    subject.observers.push_back(&user2);

    subject.notify("Hello!"); 
}
output:
    [User] Hello!
    [User] Hello!
优缺点
  • ✅ 松耦合,主题和观察者独立变化。
  • ❌ 观察者过多时可能影响性能。

总结

 

模式核心目标典型场景
单例模式控制实例数量全局配置、资源共享
工厂模式封装对象创建动态创建对象、解耦客户端与实现
观察者模式实现对象间动态通知机制事件处理、实时数据更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值