当前位置: 首页 > news >正文

c++最常用的几种设计模式

在 C++ 里,最“接地气”、面试问得最多、代码里真正天天能见到的,其实集中在下面 6 种。掌握它们就能覆盖 80% 的日常设计场景。

模式一句话场景C++ 惯用法要点最常用变种
1. Singleton“全局只有一个”——日志、配置、显卡设备1) 私构造+私赋值+公静态 Instance()
2) Meyers’ Singleton(static 局部变量)线程安全又简洁
双检锁 DCLP(C++11 之后基本被 Meyers 取代)
2. Factory Method / Abstract Factory“new 太痛苦,对象类型运行时才知道”——UI 控件、数据库驱动1) 基类提供 CreateXxx() 虚函数,返回 unique_ptr<Base>Simple Factory(一个静态 Create)
3. Observer“一对多松耦合通知”——MVC、事件总线、消息队列1) 基类 IObserver 带纯虚 notify()
2) 用 vector<weak_ptr<IObserver>
Signal/Slot(Qt、boost::signals2)
4. Strategy“算法一族随便换”——排序、压缩、支付渠道1) 把算法封装成继承自 Strategy 的子类
2) 上下文存 unique_ptr<Strategy>
Policy-based design(模板+编译期多态)
5. RAII / Wrapper(语言级模式)“资源释放一定走析构”——内存、锁、句柄1) 构造里获取,析构里释放
2) 禁用拷贝或采用移动语义
unique_ptr/shared_ptr、lock_guard、fstream
6. Pimpl(编译防火墙)“头文件不动,实现随便改”——库开发1) 类内只留 struct Impl; std::unique_ptr<Impl> pImpl;

1. Singleton( Meyers 版 )

class Config {
public:static Config& instance() {static Config cfg;        // C++11 保证线程安全return cfg;}Config(const Config&) = delete;Config& operator=(const Config&) = delete;
private:Config() = default;
};

用法:Config::instance().get("timeout");

2. Factory 示例

class Shape { public: virtual void draw() = 0; };
class Circle : public Shape { void draw() override {} };using ShapePtr = std::unique_ptr<Shape>;
using Factory  = std::function<ShapePtr()>;inline ShapePtr make_circle() { return std::make_unique<Circle>(); }static std::unordered_map<std::string, Factory> g_reg = {{"circle", make_circle}
};ShapePtr shape_factory(const std::string& key){return g_reg.at(key)();
}

调用:auto p = shape_factory("circle");

3. Observer 示例(weak_ptr 防悬空)

class IObserver { public: virtual void onEvent() = 0; };class Subject {std::vector<std::weak_ptr<IObserver>> subs;
public:void subscribe(std::shared_ptr<IObserver> o){subs.emplace_back(o);}void notify(){for (auto it = subs.begin(); it != subs.end(); ) {if (auto s = it->lock()) { s->onEvent(); ++it; }else                     { it = subs.erase(it); }}}
};

4. Strategy 示例

class PayStrategy { public: virtual void pay(int cents) = 0; };
class AliPay : public PayStrategy { void pay(int) override {} };
class WechatPay : public PayStrategy { void pay(int) override {} };class Order {std::unique_ptr<PayStrategy> strategy;
public:void set_pay(std::unique_ptr<PayStrategy> s){ strategy = std::move(s); }void checkout(int cents){ strategy->pay(cents); }
};

5. RAII / Wrapper

std::unique_ptr<FILE, decltype(&fclose)>
make_file(const char* name){return {std::fopen(name,"w"), &fclose};
}

6. Pimpl

// ====== Foo.h ======
class Foo {
public:Foo();~Foo();void work();
private:struct Impl;std::unique_ptr<Impl> pImpl;
};// ====== Foo.cpp ======
struct Foo::Impl {void workImpl() { /* 真正实现 */ }
};
Foo::Foo() : pImpl(std::make_unique<Impl>()) {}
Foo::~Foo() = default;          // 必须在 cpp 里,因为 Impl 完整类型在此处才可见
void Foo::work() { pImpl->workImpl(); }
  • 单例、工厂、观察者、策略 是“最常被问”的四大行为/创建模式。

http://www.dtcms.com/a/483023.html

相关文章:

  • 河南平台网站建设公司临沂企业自助建站系统
  • 下载 asp 网站源码响应式网站 翻译代码
  • 大气医院网站源码河北省住房和城乡建设厅信用网站
  • 【agent】AI 数字人构建10:FunASR 1:语音识别C++服务/客户端构建
  • 教育机构网站建设方案书企业邮箱注册需要多少钱
  • 河南省建设工程监理协会网站cms 导航网站
  • Centos Stream 8 Tomcat学习
  • 网站系统cmsphp教育网站开发工作
  • 在Ubuntu22.04和24.04中安装Docker并安装和配置Java、Mysql、Tomcat
  • 【Linux】线程同步与互斥(1)
  • 网站开发英语英语义乌网八方资源家1688网商网
  • 基于单片机的PID调节脉动真空灭菌器上位机远程监控设计
  • 汕头网站关键词优化教程资源分享网站怎么做
  • STM32H7xx 运行 LWIP 时的 MPU 配置介绍 LAT1510
  • 能动框架战场:如何摆脱供应商锁定并在下次AI战争中生存
  • 免费试用网站空间人人开发接单官网
  • 视联网技术产业观察与分析:视频隐私与安全防护
  • 南通网站建设祥云深圳罗湖网站设计公司
  • 基于蚁群算法优化BP神经网络的实现方法
  • 《Effective Java》第10条:覆盖 equals 时请遵守通用规定
  • 广东广州快速网站制作平台鄂州网站建设哪家好
  • 安卓android自动化测试-uiautomator/uiautomator2
  • 天津 网站设计公司门户网站制作定做
  • React组件复用导致的闪烁问题及通用解决方案
  • Java EE开发技术(Servlet整合JDBC银行管理系统-上)
  • 深入理解string底层:手写高效字符串类
  • 做国际网站有用吗基础建设图片
  • 启动hbase后,hbmaster总是挂
  • 自助网站建设开发流程步骤西安活动策划执行公司
  • 计算机系统---CPU的进程与线程处理