C++ 六大常用设计模式详解(单例、工厂、策略、状态、观察者、代理) 设计模式分三大类创建型对象怎么造、行为型对象怎么交互、结构型对象怎么组合。下面逐个讲原理、适用场景、C 完整可运行代码、优缺点。一、单例模式Singleton—— 创建型1. 核心思想保证一个类全局只有唯一实例提供全局访问点。2. 使用场景全局配置管理器、日志工具、数据库连接池、窗口管理器资源昂贵不能重复创建的对象3. 两种实现懒汉、饿汉1饿汉单例线程安全程序启动直接创建cpp#include iostream using namespace std; class Singleton { private: // 1. 私有构造禁止外部new Singleton() { cout 创建单例实例 endl; } // 禁止拷贝、赋值 Singleton(const Singleton) delete; Singleton operator(const Singleton) delete; // 2. 静态全局唯一实例程序加载时初始化 static Singleton instance; public: // 3. 全局获取接口 static Singleton getInstance() { return instance; } void log(string msg) { cout 日志输出 msg endl; } }; // 类外初始化静态实例 Singleton Singleton::instance; int main() { Singleton s1 Singleton::getInstance(); Singleton s2 Singleton::getInstance(); cout s1 endl s2 endl; // 地址完全相同 s1.log(测试单例); return 0; }优点天然线程安全实现简单缺点程序启动就占用资源不用也会创建。2懒汉单例用时才创建C11 静态局部变量线程安全cppclass SingletonLazy { private: Singleton() default; SingletonLazy(const SingletonLazy) delete; SingletonLazy operator(const SingletonLazy) delete; public: static SingletonLazy getInstance() { // C11规定静态局部变量初始化线程安全 static SingletonLazy ins; return ins; } };优点延迟加载节省资源推荐项目使用。4. 优缺点优点全局唯一统一管控资源减少内存开销缺点违背单一职责、难以单元测试、生命周期依赖程序进程二、工厂模式Factory—— 创建型简单工厂 工厂方法分两层简单工厂静态工厂、工厂方法模式1. 简单工厂静态工厂核心一个工厂类根据参数动态生产不同产品。场景同类产品多分支创建逻辑集中管理。cpp#include iostream #include string using namespace std; // 产品基类 class Product { public: virtual void show() 0; virtual ~Product() default; }; // 产品A class ProductA : public Product { public: void show() override { cout 产品A endl; } }; // 产品B class ProductB : public Product { public: void show() override { cout 产品B endl; } }; // 简单工厂 class SimpleFactory { public: static Product* createProduct(string type) { if (type A) return new ProductA(); if (type B) return new ProductB(); return nullptr; } }; int main() { Product* p SimpleFactory::createProduct(A); p-show(); delete p; return 0; }缺点新增产品必须修改工厂if-else违反开闭原则。2. 工厂方法模式优化版符合开闭核心一个产品对应一个工厂基类定义工厂接口新增产品只加工厂类不改旧代码。cpp// 产品基类同上 Product // 工厂基类 class Factory { public: virtual Product* create() 0; virtual ~Factory() default; }; // A工厂 class FactoryA : public Factory { public: Product* create() override { return new ProductA(); } }; // B工厂 class FactoryB : public Factory { public: Product* create() override { return new ProductB(); } }; int main() { Factory* f new FactoryA(); Product* p f-create(); p-show(); delete p; delete f; return 0; }适用产品会持续扩展需要严格遵守开闭原则。工厂模式总结作用隔离对象创建逻辑使用者只关心产品不关心 new 细节简单工厂快速开发产品少工厂方法易扩展产品多三、策略模式Strategy—— 行为型1. 核心思想把一系列可互换算法 / 业务逻辑封装成独立策略类运行时动态切换消除大量if/else。2. 场景支付方式微信 / 支付宝 / 银行卡、排序算法、折扣计算、文件解析器3. C 代码示例支付策略cpp#include iostream using namespace std; // 策略基类支付算法 class PayStrategy { public: virtual void pay(int money) 0; virtual ~PayStrategy() default; }; // 微信支付策略 class WechatPay : public PayStrategy { public: void pay(int money) override { cout 微信支付 money 元 endl; } }; // 支付宝策略 class AliPay : public PayStrategy { public: void pay(int money) override { cout 支付宝支付 money 元 endl; } }; // 上下文Context持有策略对外统一接口 class Order { private: PayStrategy* strategy; public: // 动态设置策略 void setStrategy(PayStrategy* s) { strategy s; } void checkout(int total) { strategy-pay(total); } }; int main() { Order order; PayStrategy* wechat new WechatPay(); PayStrategy* ali new AliPay(); order.setStrategy(wechat); order.checkout(100); // 运行时切换策略 order.setStrategy(ali); order.checkout(200); delete wechat; delete ali; return 0; }优缺点优点消灭臃肿 if-else算法独立可单元测试动态切换符合开闭缺点策略类数量膨胀客户端需要知道所有策略才能切换四、状态模式State—— 行为型1. 核心思想对象的行为依赖自身状态不同状态执行完全不同逻辑把每个状态封装为独立类状态切换自动流转。和策略模式区分策略算法平行互换外部主动切换状态状态内部自动流转上下文随条件自动换状态。2. 场景电梯运行开门 / 关门 / 上行 / 下行、订单状态待支付 / 已支付 / 已发货 / 完成、游戏角色状态3. 示例电梯状态机cpp#include iostream using namespace std; // 前置声明上下文 class Elevator; // 状态基类 class State { protected: Elevator* ctx; public: State(Elevator* e) : ctx(e) {} virtual void open() 0; virtual void close() 0; virtual void run() 0; virtual ~State() default; }; // 上下文电梯 class Elevator { public: State* curState; void setState(State* s) { curState s; } void openDoor() { curState-open(); } void closeDoor() { curState-close(); } void runLift() { curState-run(); } }; // 开门状态 class OpenState : public State { public: using State::State; void open() override { cout 门已经开着 endl; } void close() override; void run() override { cout 开门不能运行电梯 endl; } }; // 关门状态 class CloseState : public State { public: using State::State; void open() override { cout 开门 endl; ctx-setState(new OpenState(ctx)); } void close() override { cout 门已关闭 endl; } void run() override { cout 电梯启动运行 endl; } }; void OpenState::close() { cout 关门 endl; ctx-setState(new CloseState(ctx)); } int main() { Elevator lift; lift.setState(new CloseState(lift)); lift.openDoor(); // 切换开门状态 lift.runLift(); // 开门禁止运行 lift.closeDoor(); // 切回关门 lift.runLift(); return 0; }优缺点优点状态逻辑拆分消除大量状态判断 if/switch状态流转清晰缺点状态类数量多状态切换管理复杂五、观察者模式Observer—— 行为型发布订阅1. 核心思想一对多依赖主题发布者状态变化时自动通知所有订阅观察者解耦发布与接收。2. 场景GUI 事件监听、消息推送、日志订阅、游戏事件、MQ 简易实现3. C 代码cpp#include iostream #include vector #include string using namespace std; // 观察者基类 class Observer { public: virtual void update(string msg) 0; virtual ~Observer() default; }; // 主题发布者 class Subject { private: vectorObserver* obsList; public: // 订阅 void attach(Observer* o) { obsList.push_back(o); } // 取消订阅 void detach(Observer* o) { for (auto it obsList.begin(); it ! obsList.end();) { if (*it o) it obsList.erase(it); else it; } } // 广播通知所有观察者 void notify(string msg) { for (auto o : obsList) o-update(msg); } }; // 具体观察者用户A class UserA : public Observer { public: void update(string msg) override { cout 用户A收到消息 msg endl; } }; class UserB : public Observer { public: void update(string msg) override { cout 用户B收到消息 msg endl; } }; int main() { Subject news; UserA a; UserB b; news.attach(a); news.attach(b); news.notify(今日热点C设计模式); // 全部收到 news.detach(b); news.notify(第二条新闻); // 只有A收到 return 0; }优缺点优点发布订阅完全解耦一对多广播动态增删观察者缺点通知顺序不可控大量观察者会有性能开销循环依赖易内存泄漏六、代理模式Proxy—— 结构型1. 核心思想提供代理对象控制对真实目标对象的访问在调用真实对象前后加逻辑缓存、鉴权、日志、延迟创建。分类静态代理、动态代理C 无原生动态代理一般用静态2. 使用场景远程代理RPC、虚拟代理大图片延迟加载、保护代理权限校验、日志缓存代理3. 静态代理完整示例图片加载cpp#include iostream #include string using namespace std; // 公共抽象接口 class Image { public: virtual void display() 0; virtual ~Image() default; }; // 真实对象大图加载耗时 class RealImage : public Image { private: string path; public: RealImage(string p) : path(p) { cout 加载大图资源 path endl; } void display() override { cout 展示图片 path endl; } }; // 代理对象虚拟代理延迟加载 class ImageProxy : public Image { private: string path; RealImage* realImg nullptr; public: ImageProxy(string p) : path(p) {} void display() override { // 延迟创建真实对象 if (!realImg) realImg new RealImage(path); realImg-display(); } ~ImageProxy() { delete realImg; } }; int main() { // 创建代理此时不加载大图 Image* img new ImageProxy(big_pic.png); cout 页面渲染完成点击才加载图片\n; img-display(); // 第一次调用才加载 img-display(); // 第二次直接展示无需重复加载 delete img; return 0; }代理模式变种说明虚拟代理延迟创建重量级对象上图示例保护代理调用前校验权限无权限禁止访问真实对象日志代理统一打印接口调用日志、耗时统计远程代理封装网络请求隐藏跨进程 / 跨机器调用细节优缺点优点控制访问、扩展附加逻辑缓存 / 鉴权 / 日志、延迟加载、隔离真实对象缺点多一层代理类增加代码复杂度模式快速分类总结表格模式类型核心作用核心关键词单例创建型全局唯一实例私有构造、静态实例工厂创建型统一创建对象隔离 new产品基类、工厂生产策略行为型动态替换平行算法Context 持有策略外部切换状态行为型根据内部状态自动切换逻辑状态内部流转、状态机观察者行为型一对多消息通知发布 - 订阅、广播更新代理结构型控制访问真实对象附加逻辑代理包装、前置后置处理高频对比易混点策略 vs 状态策略算法平等互换外部主动传入切换无状态流转关系状态对象自带状态内部条件自动切换有流转顺序工厂 vs 代理工厂只管创建对象代理包装已有对象控制访问单例 vs 静态类单例是对象可继承、传参、延迟创建静态类全静态无实例生命周期