C++ 设计模式概述及常用模式

C++ 设计模式概述
本文介绍了C++中23种设计模式的分类及实现示例,主要分为三大类:

创建型模式(5个):单例模式(常用)、工厂方法模式(常用)、抽象工厂模式(常用)、建造者模式和原型模式。这些模式专注于对象的创建机制。

结构型模式(7个):适配器模式(常用)、桥接模式、组合模式和装饰器模式(常用)等。这些模式处理类和对象的组合方式。

行为型模式:未完整列出,但包含观察者模式等(未展示完整代码)。

文章通过简洁的C++代码示例展示了常用设计模式的实现方法,如单例模式通过私有构造函数和静态方法确保唯一实例,工厂方法模式通过抽象工厂类创建产品等。这些模式为解决特定设计问题提供了可重用的解决方案。

C++ 设计模式概述及常用模式

设计模式可分为三大类:创建型、结构型、行为型。以下是23个设计模式的分类及代码示例:

一、创建型模式(5个)

1. 单例模式(Singleton)⭐ 常用

classSingleton{private:static Singleton* instance;Singleton(){}// 私有构造函数public:static Singleton*getInstance(){if(instance ==nullptr){ instance =newSingleton();}return instance;}// 删除拷贝构造和赋值操作符Singleton(const Singleton&)=delete; Singleton&operator=(const Singleton&)=delete;};

2. 工厂方法模式(Factory Method)⭐ 常用

// 产品接口classProduct{public:virtual~Product(){}virtualvoidoperation()=0;};// 具体产品classConcreteProductA:publicProduct{public:voidoperation() override { cout <<"Product A operation"<< endl;}};// 工厂接口classCreator{public:virtual~Creator(){}virtual Product*factoryMethod()=0;};// 具体工厂classConcreteCreatorA:publicCreator{public: Product*factoryMethod() override {returnnewConcreteProductA();}};

3. 抽象工厂模式(Abstract Factory)⭐ 常用

// 抽象产品AclassAbstractProductA{public:virtual~AbstractProductA(){}virtualvoidoperationA()=0;};// 抽象产品BclassAbstractProductB{public:virtual~AbstractProductB(){}virtualvoidoperationB()=0;};// 抽象工厂classAbstractFactory{public:virtual AbstractProductA*createProductA()=0;virtual AbstractProductB*createProductB()=0;};// 具体工厂1classConcreteFactory1:publicAbstractFactory{public: AbstractProductA*createProductA() override {returnnewConcreteProductA1();} AbstractProductB*createProductB() override {returnnewConcreteProductB1();}};

4. 建造者模式(Builder)

classProduct{private: string partA; string partB;public:voidsetPartA(const string& a){ partA = a;}voidsetPartB(const string& b){ partB = b;}};classBuilder{public:virtual~Builder(){}virtualvoidbuildPartA()=0;virtualvoidbuildPartB()=0;virtual Product*getResult()=0;};classDirector{private: Builder* builder;public:Director(Builder* b):builder(b){}voidconstruct(){ builder->buildPartA(); builder->buildPartB();}};

5. 原型模式(Prototype)

classPrototype{public:virtual~Prototype(){}virtual Prototype*clone()const=0;virtualvoidprint()const=0;};classConcretePrototype:publicPrototype{private:int data;public:ConcretePrototype(int d):data(d){} Prototype*clone()const override {returnnewConcretePrototype(*this);}voidprint()const override { cout <<"Data: "<< data << endl;}};

二、结构型模式(7个)

6. 适配器模式(Adapter)⭐ 常用

// 目标接口classTarget{public:virtual~Target(){}virtualvoidrequest(){ cout <<"Target request"<< endl;}};// 需要适配的类classAdaptee{public:voidspecificRequest(){ cout <<"Adaptee specific request"<< endl;}};// 适配器classAdapter:publicTarget{private: Adaptee* adaptee;public:Adapter(Adaptee* a):adaptee(a){}voidrequest() override { adaptee->specificRequest();}};

7. 桥接模式(Bridge)

// 实现接口classImplementor{public:virtual~Implementor(){}virtualvoidoperationImpl()=0;};// 抽象类classAbstraction{protected: Implementor* impl;public:Abstraction(Implementor* i):impl(i){}virtual~Abstraction(){}virtualvoidoperation(){ impl->operationImpl();}};

8. 组合模式(Composite)

classComponent{public:virtual~Component(){}virtualvoidoperation()=0;virtualvoidadd(Component*){}virtualvoidremove(Component*){}virtual Component*getChild(int){returnnullptr;}};classLeaf:publicComponent{public:voidoperation() override { cout <<"Leaf operation"<< endl;}};classComposite:publicComponent{private: vector<Component*> children;public:voidoperation() override { cout <<"Composite operation"<< endl;for(auto child : children){ child->operation();}}voidadd(Component* c) override { children.push_back(c);}};

9. 装饰器模式(Decorator)⭐ 常用

classComponent{public:virtual~Component(){}virtualvoidoperation()=0;};classConcreteComponent:publicComponent{public:voidoperation() override { cout <<"ConcreteComponent operation"<< endl;}};classDecorator:publicComponent{protected: Component* component;public:Decorator(Component* c):component(c){}voidoperation() override { component->operation();}};classConcreteDecorator:publicDecorator{public:ConcreteDecorator(Component* c):Decorator(c){}voidoperation() override {Decorator::operation();addedBehavior();}voidaddedBehavior(){ cout <<"Added behavior"<< endl;}};

10. 外观模式(Facade)⭐ 常用

classSubsystemA{public:voidoperationA(){ cout <<"Subsystem A operation"<< endl;}};classSubsystemB{public:voidoperationB(){ cout <<"Subsystem B operation"<< endl;}};classFacade{private: SubsystemA* a; SubsystemB* b;public:Facade():a(newSubsystemA()),b(newSubsystemB()){}voidoperation(){ a->operationA(); b->operationB();}};

11. 享元模式(Flyweight)

classFlyweight{public:virtual~Flyweight(){}virtualvoidoperation(int extrinsicState)=0;};classConcreteFlyweight:publicFlyweight{private:int intrinsicState;public:ConcreteFlyweight(int state):intrinsicState(state){}voidoperation(int extrinsicState) override { cout <<"Intrinsic: "<< intrinsicState <<", Extrinsic: "<< extrinsicState << endl;}};classFlyweightFactory{private: unordered_map<int, Flyweight*> flyweights;public: Flyweight*getFlyweight(int key){if(flyweights.find(key)== flyweights.end()){ flyweights[key]=newConcreteFlyweight(key);}return flyweights[key];}};

12. 代理模式(Proxy)⭐ 常用

classSubject{public:virtual~Subject(){}virtualvoidrequest()=0;};classRealSubject:publicSubject{public:voidrequest() override { cout <<"RealSubject request"<< endl;}};classProxy:publicSubject{private: RealSubject* realSubject;public:Proxy():realSubject(nullptr){}voidrequest() override {if(realSubject ==nullptr){ realSubject =newRealSubject();} realSubject->request();}};

三、行为型模式(11个)

13. 责任链模式(Chain of Responsibility)

classHandler{protected: Handler* successor;public:Handler():successor(nullptr){}virtual~Handler(){}voidsetSuccessor(Handler* s){ successor = s;}virtualvoidhandleRequest(int request)=0;};classConcreteHandler1:publicHandler{public:voidhandleRequest(int request) override {if(request <10){ cout <<"Handler1 handled request "<< request << endl;}elseif(successor !=nullptr){ successor->handleRequest(request);}}};

14. 命令模式(Command)⭐ 常用

classReceiver{public:voidaction(){ cout <<"Receiver action"<< endl;}};classCommand{public:virtual~Command(){}virtualvoidexecute()=0;};classConcreteCommand:publicCommand{private: Receiver* receiver;public:ConcreteCommand(Receiver* r):receiver(r){}voidexecute() override { receiver->action();}};classInvoker{private: Command* command;public:voidsetCommand(Command* c){ command = c;}voidexecuteCommand(){ command->execute();}};

15. 解释器模式(Interpreter)

classContext{// 上下文信息};classExpression{public:virtual~Expression(){}virtualboolinterpret(Context& context)=0;};classTerminalExpression:publicExpression{public:boolinterpret(Context& context) override {// 终结符解释逻辑returntrue;}};

16. 迭代器模式(Iterator)⭐ 常用

template<typenameT>classIterator{public:virtual~Iterator(){}virtual T next()=0;virtualboolhasNext()=0;};template<typenameT>classConcreteIterator:publicIterator<T>{private: vector<T> collection; size_t position;public:ConcreteIterator(const vector<T>& col):collection(col),position(0){} T next() override {return collection[position++];}boolhasNext() override {return position < collection.size();}};

17. 中介者模式(Mediator)

classColleague;classMediator{public:virtual~Mediator(){}virtualvoidnotify(Colleague* sender, string event)=0;};classColleague{protected: Mediator* mediator;public:Colleague(Mediator* m =nullptr):mediator(m){}voidsetMediator(Mediator* m){ mediator = m;}};classConcreteColleague1:publicColleague{public:voiddoSomething(){// ... 自己的逻辑 mediator->notify(this,"event1");}};

18. 备忘录模式(Memento)

classMemento{private: string state;public:Memento(const string& s):state(s){} string getState()const{return state;}};classOriginator{private: string state;public:voidsetState(const string& s){ state = s;} string getState()const{return state;} Memento*createMemento(){returnnewMemento(state);}voidrestoreMemento(Memento* m){ state = m->getState();}};

19. 观察者模式(Observer)⭐ 常用

classObserver{public:virtual~Observer(){}virtualvoidupdate(float temperature)=0;};classSubject{private: vector<Observer*> observers;public:voidattach(Observer* o){ observers.push_back(o);}voiddetach(Observer* o){// 移除观察者逻辑}voidnotify(float temperature){for(auto observer : observers){ observer->update(temperature);}}};classConcreteObserver:publicObserver{public:voidupdate(float temperature) override { cout <<"Temperature updated: "<< temperature << endl;}};

20. 状态模式(State)

classContext;classState{public:virtual~State(){}virtualvoidhandle(Context* context)=0;};classContext{private: State* state;public:Context(State* s):state(s){}voidsetState(State* s){ state = s;}voidrequest(){ state->handle(this);}};classConcreteStateA:publicState{public:voidhandle(Context* context) override;};

21. 策略模式(Strategy)⭐ 常用

classStrategy{public:virtual~Strategy(){}virtualvoidalgorithm()=0;};classConcreteStrategyA:publicStrategy{public:voidalgorithm() override { cout <<"Strategy A algorithm"<< endl;}};classContext{private: Strategy* strategy;public:Context(Strategy* s):strategy(s){}voidsetStrategy(Strategy* s){ strategy = s;}voidexecuteStrategy(){ strategy->algorithm();}};

22. 模板方法模式(Template Method)⭐ 常用

classAbstractClass{public:virtual~AbstractClass(){}voidtemplateMethod(){primitiveOperation1();primitiveOperation2();}virtualvoidprimitiveOperation1()=0;virtualvoidprimitiveOperation2()=0;};classConcreteClass:publicAbstractClass{public:voidprimitiveOperation1() override { cout <<"Concrete operation 1"<< endl;}voidprimitiveOperation2() override { cout <<"Concrete operation 2"<< endl;}};

23. 访问者模式(Visitor)

classConcreteElementA;classConcreteElementB;classVisitor{public:virtual~Visitor(){}virtualvoidvisit(ConcreteElementA* element)=0;virtualvoidvisit(ConcreteElementB* element)=0;};classElement{public:virtual~Element(){}virtualvoidaccept(Visitor* visitor)=0;};classConcreteElementA:publicElement{public:voidaccept(Visitor* visitor) override { visitor->visit(this);}voidoperationA(){ cout <<"Operation A"<< endl;}};

四、最常用的设计模式(建议优先掌握)

必须掌握的5个核心模式

  1. 单例模式 - 全局唯一实例,如配置管理器、日志管理器
  2. 工厂方法模式 - 对象创建解耦,易于扩展
  3. 观察者模式 - 事件处理、消息通知系统
  4. 策略模式 - 算法封装,运行时切换
  5. 装饰器模式 - 动态添加功能

次常用的5个模式

  1. 适配器模式 - 接口转换
  2. 代理模式 - 访问控制、延迟加载
  3. 模板方法模式 - 算法框架定义
  4. 命令模式 - 命令封装、撤销/重做
  5. 外观模式 - 简化复杂子系统接口

学习建议

  1. 先从单例、工厂、观察者、策略开始学习
  2. 理解每种模式的应用场景而不仅仅是代码
  3. 避免过度设计,只在必要时使用设计模式
  4. C++11/14/17的现代特性(智能指针、lambda等)可以简化某些模式的实现

这些模式提供了经过验证的解决方案,能帮助你构建更灵活、可维护的软件系统。

Read more

【Electron架构解析】打破浏览器沙盒:从 Web 前端到桌面客户端的技术跨越

【Electron架构解析】打破浏览器沙盒:从 Web 前端到桌面客户端的技术跨越

在现代企业级应用开发中,纯粹的 B/S(Browser/Server)架构有时难以满足日益复杂的业务需求。当项目交付形态从 Web 链接转变为桌面可执行程序(.exe/.dmg)时,这标志着我们进入了 Electron 的领域。对于习惯了 Chrome 开发者工具的前端工程师而言,理解 Electron 的本质,是完成从“网页开发”到“应用开发”思维转型的关键一步。 本文将深入剖析 Electron 的双进程架构,并以实际工程中的配置文件为例,解读它是如何利用 Web 技术栈突破浏览器安全沙盒的限制。 目录 一、 混合运行时:Chromium 与 Node.js 的深度融合 二、 核心中枢:主进程 (Main Process) 的权限突破 三、 安全桥梁:

By Ne0inhk
电影票房数据采集分析可视化系统 | Python Flask MySQL Echarts Requests爬虫 大数据 人工智能 毕业设计源码(建议收藏)✅

电影票房数据采集分析可视化系统 | Python Flask MySQL Echarts Requests爬虫 大数据 人工智能 毕业设计源码(建议收藏)✅

博主介绍:✌全网粉丝10W+,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久,选择我们就是选择放心、选择安心毕业✌ > 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与我联系了。🍅 点击查看作者主页,了解更多项目! 🍅感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助同学们顺利毕业 。🍅 1、毕业设计:2026年计算机专业毕业设计选题汇总(建议收藏)✅ 2、大数据毕业设计:2026年选题大全 深度学习 python语言 JAVA语言 hadoop和spark(建议收藏)✅ 1、项目介绍 技术栈 采用Python语言开发,结合Flask框架搭建后端服务,使用MySQL数据库存储数据,借助Echarts实现数据可视化效果,通过requests库编写爬虫程序,从艺恩电影票房网获取相关数据。 功能模块 * 地区票房占有率分析 * 月份票房分析 * 电影类型票房占有率分析 * 首页展示 * 实时票房排名 * 采集日志 * 数据采集 项目介绍 该电影票

By Ne0inhk

Palantir Foundry 五层架构模型详解

整体架构层次 Palantir Foundry 五层架构模型 ┌─────────────────────────────────────────────────────────────┐ │ 决策编排层 (Decision Orchestration) │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 分析应用层 (Analytic Applications) │ │ │ │ ┌─────────────────────────────────────────────┐ │ │ │ │ │ 本体层 (Ontology Layer) │ │ │ │ │ │ ┌─────────────────────────────────────┐ │ │ │ │ │ │ │ 模型层 (Model Layer) │ │ │ │ │ │ │ │ ┌─────────────────────────────┐ │ │ │ │ │ │ │ │ │ 数据层 (Data Layer) │ │ │ │ │ │ │ │ │ │

By Ne0inhk
MySQL 表约束核心指南:从基础约束到外键关联(含实战案例)

MySQL 表约束核心指南:从基础约束到外键关联(含实战案例)

🔥草莓熊Lotso:个人主页 ❄️个人专栏: 《C++知识分享》《Linux 入门到实践:零基础也能懂》 ✨生活是默默的坚持,毅力是永久的享受! 🎬 博主简介: 文章目录 * 前言: * 一. 表约束核心概念 * 二. 基础约束:NULL/NOT NULL 与 DEFAULT * 2.1 空属性约束(NULL/NOT NULL) * 2.2 默认值约束(DEFAULT) * 2.3 列描述(COMMENT) * 2.4 零填充约束(ZEROFILL) * 三. 核心约束:主键、自增长与唯一键 * 3.1 主键约束(PRIMARY KEY) * 3.

By Ne0inhk