Skip to content

设计模式

单例模式(Singleton)

单例模式确保:

  1. 一个类只有一个实例
  2. 全局可访问这个实例

典型用途:日志系统、配置管理器、数据库连接池、线程池等。

“懒汉式”与“饿汉式”的区别

饿汉式: 程序启动时就创建实例, 简单、线程安全(初始化时机唯一)可能浪费资源

懒汉式: 第一次使用时才创建实例,延迟加载、节省资源,需要考虑线程安全

class Singleton {
private:
    Singleton() {}                     // 私有构造
    ~Singleton() {}                    // 可选:防止外部析构
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;
public:
    static Singleton& getInstance() {
        static Singleton instance;     // C++11保证线程安全初始化
        return instance;
    }
};

Factory Method

创建不同的子类对象

class Shape {
public:
    virtual ~Shape() = default;
    virtual void draw() = 0;
};

class Circle : public Shape { /*...*/ };
class Rect   : public Shape { /*...*/ };

std::unique_ptr<Shape> createShape(const std::string& type) {
    if (type == "circle") return std::make_unique<Circle>();
    if (type == "rect")   return std::make_unique<Rect>();
    return nullptr;
}

Strategy

class SortStrategy {
public:
    virtual ~SortStrategy() = default;
    virtual void sort(std::vector<int>& data) = 0;
};

class QuickSort : public SortStrategy { /*...*/ };
class MergeSort : public SortStrategy { /*...*/ };

class Context {
public:
    explicit Context(std::unique_ptr<SortStrategy> s)
      : strategy_(std::move(s)) {}

    void setStrategy(std::unique_ptr<SortStrategy> s) {
        strategy_ = std::move(s);
    }
    void doSort(std::vector<int>& data) {
        strategy_->sort(data);
    }
private:
    std::unique_ptr<SortStrategy> strategy_;
};

Observer

场景:一对多通知:GUI 事件、订阅/发布、配置更新、游戏事件等。

class Observer {
public:
    virtual ~Observer() = default;
    virtual void onNotify(int data) = 0;
};

class Subject {
public:
    void addObserver(Observer* o) { obs_.push_back(o); }
    void notify(int data) {
        for (auto o : obs_) o->onNotify(data);
    }
private:
    std::vector<Observer*> obs_;
};

Reactor pattern

在有成千上万连接时,避免“一个连接一个线程”的资源浪费,用事件驱动 + 非阻塞 IO来处理大量并发连接。

Proactor Pattern

Proxy Pattern

代理模式(Proxy Pattern):为某个对象提供一个替身/中介(代理),由代理控制对真实对象的访问。对外接口不变,调用方“看起来”在用目标对象,实际上请求会先经过代理