设计模式C++实现(1)——工厂模式

Java+Vue+Spring Boot+MySQL编程训练系统毕业设计实战指南 在软件工程实践中,前后端分离架构已成为构建现代Web应用的主流范式。其核心原理在于将用户界面(前端)与业务逻辑和数据(后端)解耦,通过RESTful API进行通信,从而实现关注点分离、提升开发效率和系统可维护性。这种架构模式的技术价值在于支持团队并行开发、便于技术栈选型与独立部署。典型的应用场景包括各类管理后台、电商平台以及在线教育系统。本文聚焦于一个具体的工程实践案例——编程训练系统(OJ),深入剖析如何运用Java、Spring Boot、Vue和MySQL这套主流技术栈,从零开始构建一个功能完整、结 阅读详情
 软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。最近看设计模式的书,对于每个模式,用C++写了个小例子,加深一下理解。主要参考《大话设计模式》和《设计模式:可复用面向对象软件的基础》两本书。本文介绍工厂模式的实现。

       工厂模式属于创建型模式,大致可以分为三类,简单工厂模式、工厂方法模式、抽象工厂模式。听上去差不多,都是工厂模式。下面一个个介绍,首先介绍简单工厂模式,它的主要特点是需要在工厂类中做判断,从而创造相应的产品。当增加新的产品时,就需要修改工厂类。有点抽象,举个例子就明白了。有一家生产处理器核的厂家,它只有一个工厂,能够生产两种型号的处理器核。客户需要什么样的处理器核,一定要显示地告诉生产工厂。下面给出一种实现方案。

  1. enum CTYPE {COREA, COREB};     
  2. class SingleCore    
  3. {    
  4. public:    
  5.     virtual void Show() = 0;  
  6. };    
  7. //单核A     
  8. class SingleCoreA: public SingleCore    
  9. {    
  10. public:    
  11.     void Show() { cout<<"SingleCore A"<<endl; }    
  12. };    
  13. //单核B     
  14. class SingleCoreB: public SingleCore    
  15. {    
  16. public:    
  17.     void Show() { cout<<"SingleCore B"<<endl; }    
  18. };    
  19. //唯一的工厂,可以生产两种型号的处理器核,在内部判断     
  20. class Factory    
  21. {    
  22. public:     
  23.     SingleCore* CreateSingleCore(enum CTYPE ctype)    
  24.     {    
  25.         if(ctype == COREA) //工厂内部判断     
  26.             return new SingleCoreA(); //生产核A     
  27.         else if(ctype == COREB)    
  28.             return new SingleCoreB(); //生产核B     
  29.         else    
  30.             return NULL;    
  31.     }    
  32. };    
[cpp]  view plain copy
  1. enum CTYPE {COREA, COREB};     
  2. class SingleCore    
  3. {    
  4. public:    
  5.     virtual void Show() = 0;  
  6. };    
  7. //单核A    
  8. class SingleCoreA: public SingleCore    
  9. {    
  10. public:    
  11.     void Show() { cout<<"SingleCore A"<<endl; }    
  12. };    
  13. //单核B    
  14. class SingleCoreB: public SingleCore    
  15. {    
  16. public:    
  17.     void Show() { cout<<"SingleCore B"<<endl; }    
  18. };    
  19. //唯一的工厂,可以生产两种型号的处理器核,在内部判断    
  20. class Factory    
  21. {    
  22. public:     
  23.     SingleCore* CreateSingleCore(enum CTYPE ctype)    
  24.     {    
  25.         if(ctype == COREA) //工厂内部判断    
  26.             return new SingleCoreA(); //生产核A    
  27.         else if(ctype == COREB)    
  28.             return new SingleCoreB(); //生产核B    
  29.         else    
  30.             return NULL;    
  31.     }    
  32. };    

       这样设计的主要缺点之前也提到过,就是要增加新的核类型时,就需要修改工厂类。这就违反了开放封闭原则:软件实体(类、模块、函数)可以扩展,但是不可修改。于是,工厂方法模式出现了。所谓工厂方法模式,是指定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。

       听起来很抽象,还是以刚才的例子解释。这家生产处理器核的产家赚了不少钱,于是决定再开设一个工厂专门用来生产B型号的单核,而原来的工厂专门用来生产A型号的单核。这时,客户要做的是找好工厂,比如要A型号的核,就找A工厂要;否则找B工厂要,不再需要告诉工厂具体要什么型号的处理器核了。下面给出一个实现方案。

  1. class SingleCore    
  2. {    
  3. public:    
  4.     virtual void Show() = 0;  
  5. };    
  6. //单核A     
  7. class SingleCoreA: public SingleCore    
  8. {    
  9. public:    
  10.     void Show() { cout<<"SingleCore A"<<endl; }    
  11. };    
  12. //单核B     
  13. class SingleCoreB: public SingleCore    
  14. {    
  15. public:    
  16.     void Show() { cout<<"SingleCore B"<<endl; }    
  17. };    
  18. class Factory    
  19. {    
  20. public:    
  21.     virtual SingleCore* CreateSingleCore() = 0;  
  22. };    
  23. //生产A核的工厂     
  24. class FactoryA: public Factory    
  25. {    
  26. public:    
  27.     SingleCoreA* CreateSingleCore() { return new SingleCoreA; }    
  28. };    
  29. //生产B核的工厂     
  30. class FactoryB: public Factory    
  31. {    
  32. public:    
  33.     SingleCoreB* CreateSingleCore() { return new SingleCoreB; }    
  34. };    
[cpp]  view plain copy
  1. class SingleCore    
  2. {    
  3. public:    
  4.     virtual void Show() = 0;  
  5. };    
  6. //单核A    
  7. class SingleCoreA: public SingleCore    
  8. {    
  9. public:    
  10.     void Show() { cout<<"SingleCore A"<<endl; }    
  11. };    
  12. //单核B    
  13. class SingleCoreB: public SingleCore    
  14. {    
  15. public:    
  16.     void Show() { cout<<"SingleCore B"<<endl; }    
  17. };    
  18. class Factory    
  19. {    
  20. public:    
  21.     virtual SingleCore* CreateSingleCore() = 0;  
  22. };    
  23. //生产A核的工厂    
  24. class FactoryA: public Factory    
  25. {    
  26. public:    
  27.     SingleCoreA* CreateSingleCore() { return new SingleCoreA; }    
  28. };    
  29. //生产B核的工厂    
  30. class FactoryB: public Factory    
  31. {    
  32. public:    
  33.     SingleCoreB* CreateSingleCore() { return new SingleCoreB; }    
  34. };    

       工厂方法模式也有缺点,每增加一种产品,就需要增加一个对象的工厂。如果这家公司发展迅速,推出了很多新的处理器核,那么就要开设相应的新工厂。在C++实现中,就是要定义一个个的工厂类。显然,相比简单工厂模式,工厂方法模式需要更多的类定义。

       既然有了简单工厂模式和工厂方法模式,为什么还要有抽象工厂模式呢?它到底有什么作用呢?还是举这个例子,这家公司的技术不断进步,不仅可以生产单核处理器,也能生产多核处理器。现在简单工厂模式和工厂方法模式都鞭长莫及。抽象工厂模式登场了。它的定义为提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。具体这样应用,这家公司还是开设两个工厂,一个专门用来生产A型号的单核多核处理器,而另一个工厂专门用来生产B型号的单核多核处理器,下面给出实现的代码。

  1. //单核     
  2. class SingleCore     
  3. {    
  4. public:    
  5.     virtual void Show() = 0;  
  6. };    
  7. class SingleCoreA: public SingleCore      
  8. {    
  9. public:    
  10.     void Show() { cout<<"Single Core A"<<endl; }    
  11. };    
  12. class SingleCoreB :public SingleCore    
  13. {    
  14. public:    
  15.     void Show() { cout<<"Single Core B"<<endl; }    
  16. };    
  17. //多核     
  18. class MultiCore      
  19. {    
  20. public:    
  21.     virtual void Show() = 0;  
  22. };    
  23. class MultiCoreA : public MultiCore      
  24. {    
  25. public:    
  26.     void Show() { cout<<"Multi Core A"<<endl; }    
  27.     
  28. };    
  29. class MultiCoreB : public MultiCore      
  30. {    
  31. public:    
  32.     void Show() { cout<<"Multi Core B"<<endl; }    
  33. };    
  34. //工厂     
  35. class CoreFactory      
  36. {    
  37. public:    
  38.     virtual SingleCore* CreateSingleCore() = 0;  
  39.     virtual MultiCore* CreateMultiCore() = 0;  
  40. };    
  41. //工厂A,专门用来生产A型号的处理器     
  42. class FactoryA :public CoreFactory    
  43. {    
  44. public:    
  45.     SingleCore* CreateSingleCore() { return new SingleCoreA(); }    
  46.     MultiCore* CreateMultiCore() { return new MultiCoreA(); }    
  47. };    
  48. //工厂B,专门用来生产B型号的处理器     
  49. class FactoryB : public CoreFactory    
  50. {    
  51. public:    
  52.     SingleCore* CreateSingleCore() { return new SingleCoreB(); }    
  53.     MultiCore* CreateMultiCore() { return new MultiCoreB(); }    
  54. };   
[cpp]  view plain copy
  1. //单核    
  2. class SingleCore     
  3. {    
  4. public:    
  5.     virtual void Show() = 0;  
  6. };    
  7. class SingleCoreA: public SingleCore      
  8. {    
  9. public:    
  10.     void Show() { cout<<"Single Core A"<<endl; }    
  11. };    
  12. class SingleCoreB :public SingleCore    
  13. {    
  14. public:    
  15.     void Show() { cout<<"Single Core B"<<endl; }    
  16. };    
  17. //多核    
  18. class MultiCore      
  19. {    
  20. public:    
  21.     virtual void Show() = 0;  
  22. };    
  23. class MultiCoreA : public MultiCore      
  24. {    
  25. public:    
  26.     void Show() { cout<<"Multi Core A"<<endl; }    
  27.     
  28. };    
  29. class MultiCoreB : public MultiCore      
  30. {    
  31. public:    
  32.     void Show() { cout<<"Multi Core B"<<endl; }    
  33. };    
  34. //工厂    
  35. class CoreFactory      
  36. {    
  37. public:    
  38.     virtual SingleCore* CreateSingleCore() = 0;  
  39.     virtual MultiCore* CreateMultiCore() = 0;  
  40. };    
  41. //工厂A,专门用来生产A型号的处理器    
  42. class FactoryA :public CoreFactory    
  43. {    
  44. public:    
  45.     SingleCore* CreateSingleCore() { return new SingleCoreA(); }    
  46.     MultiCore* CreateMultiCore() { return new MultiCoreA(); }    
  47. };    
  48. //工厂B,专门用来生产B型号的处理器    
  49. class FactoryB : public CoreFactory    
  50. {    
  51. public:    
  52.     SingleCore* CreateSingleCore() { return new SingleCoreB(); }    
  53.     MultiCore* CreateMultiCore() { return new MultiCoreB(); }    
  54. };   

        至此,工厂模式介绍完了。利用Rational Rose 2003软件,给出三种工厂模式的UML图,加深印象。

         简单工厂模式的UML图:

         工厂方法的UML图:

         抽象工厂模式的UML图:



         本人享有博客文章的版权,转载请标明出处 http://blog.youkuaiyun.com/wuzhekai1985

YOLOv8 TensorRT C++部署实战详解:从XMake构建到推理流水线 本项目实现了一个基于YOLOv8和TensorRT的高性能火灾烟雾检测系统,具有以下核心特点: 技术架构:采用TensorRT 8.6+进行GPU加速推理,结合CUDA 12.1和OpenCV 4.8+,实现高效计算机视觉处理。系统使用XMake替代CMake构建,配置更简洁高效。 阅读详情

相关推荐

麦当劳app之sign逆向分析

摘要:本文分析了麦当劳APP请求参数sign的逆向过程。通过抓包发现32位sign参数疑似MD5加密,使用frida-trace工具跟踪CC_MD5函数验证其为标准MD5算法。加密参数包含时间戳、token、版本号等固定和动态字段,拼接后经MD5加密生成sign。文章提供了JS和Python两种实现方案,包含完整的请求头参数和加密逻辑,最终成功获取API响应数据。该研究仅用于逆向技术学习,展示了移动应用常见加密参数的逆向分析方法。

佛系更新... 2437

抽象工厂模式

1. 抽象工厂模式的动机与定义 1.1 抽象工厂模式的动机 在工厂方法模式中具体的工厂负责生产具体的产品,每一个产品对应一个工厂,工厂方法也具有唯一性,一般情况下,一个具体的工厂只有一个工厂方法或一组重载的工厂方法。但是有时候我们并不希望一个工厂只生产一种单一产品,比如电视设备工厂,希望它能够生产电视机、电冰箱、空调等设备,而不是生产某种类型的电器。 1.2 抽象工厂模式的定义 抽象工厂模式定义:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称Kit模式,属于对象创

day day no bug 1714

实用电路精讲系列---双级运放放大电路(差分放大+跟随缓冲)

本文分析了双极运放放大电路的工作原理及其典型应用。该电路结合差分放大器和跟随缓冲器,实现高精度信号放大与阻抗匹配。差分放大器通过放大差模信号并抑制共模噪声提升信噪比;跟随缓冲器则提供阻抗变换,确保信号稳定传输。两者协同工作可优化输入阻抗、增强噪声抑制并提高设计灵活性。文章还列举了10个典型应用案例,包括医疗设备、工业传感器和新能源系统等,展示了该电路在精密电子系统中的关键作用。最后通过实用电路分析,详细说明了各模块功能及设计注意事项。

weixin_40590799的博客 2957

实验2 设计模式实验1

Text 和Button 充当抽象产品,其子。(Circle)、矩形(Rectangle)和三角形(Triangle)等的绘图工具类,每个几何图形均具。在图1 中,Windows 中的Button 和Text 构成了一个Windows 产品族,而不。GIF 格式的图片、JPG 图片读取器(JpgReader)用于读取JPG 格式的图片。在每一个游戏场景中,提供了对应的地图(Map)、天气(Weather)有绘制方法draw()和擦除方法erase(),要求在绘制不支持的几何图形时,抛出一。

君临๑的博客 3882

ESP32+ST7789 LCD屏实战:5分钟搞定中文显示与图片渲染(附完整代码)

本文提供了一份详细的ESP32驱动ST7789 LCD屏幕的实战指南。通过清晰的SPI硬件连接说明、ESP-IDF框架下的初始化代码,以及图片渲染与中文字库构建的核心算法,帮助开发者快速实现中文显示与图片渲染功能,并附有完整的代码示例和性能优化技巧。

weixin_29189377的博客 438

task5:在本地搭建大模型(ollama 和 LM studio 对比),接入 openclaw

关于大模型,大家千万不要想着在本地部署,根本不可行,没有那个财力。另外大模型迭代快,不可能每周都在下载大模型。再次,还是国外的模型好用,国内的模型真的在 deepresearch 上就有很大问题,你们懂的。所以本篇文章,还是聚焦在探索层面+实操,并不会实战。

这里是 AI 食用指南,持续分享有用的AI 实操和应用! 1969

设计模式之工厂模式

法塔赫一、 简单工厂模式1. 简介2. 优缺点3. 应用场景4. 模式结构5. 代码实现二、 工厂方法模式1. 简介2. 优缺点3. 应用场景4. 模式结构5. 代码实现6. 与简单工厂的联系和区别三、 抽象工厂模式1. 简介2. 使用抽象工厂模式一般需要满足的条件3. 优缺点4. 应用场景5. 模式扩展6. 模式结构7. 代码实现8. 与工厂方法模式的联系和区别 一、 简单工厂模式 1. 简介 定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。 我们把被创建的对象称为“产品”

czm_ob的博客 1610

2024年捡垃圾指南:E5 V3/V4服务器CPU怎么选?从游戏多开到深度学习,附华南X99主板搭配清单

本文详细解析2024年E5 V3/V4服务器CPU的选购策略,涵盖游戏多开、深度学习等多种应用场景。通过对比E5 V3与V4系列的制程、功耗及性能差异,提供高性价比的CPU型号推荐及华南X99主板搭配方案,帮助用户在有限预算下打造高效能工作站。

weixin_42549451的博客 1583

大话设计模式C++实现-第1章-简单工厂模式

一、UML图 二、包含的角色 简单工厂模式包含三个角色:(1)工厂类Factory(2)抽象产品类AbstractProduct(3)具体产品类ConcreteProduct。 (1)Factory:工厂类是用来制造产品的。因此,在Factory中有一个用于制造产品的Create函数或者Generate函数之类的函数。这个函数能够根据“标识符”的不同生成不同的ConcreteProd

西青年·部落格 5527

把 SM30 用顺:从表设计到权限与传输,全面掌握 SAP Table Maintenance Generator

摘要 SAP的Table Maintenance Generator(TMG)是为配置表维护需求设计的经典工具,能够生成标准化的维护对话框(SM30)。它支持单表、维护视图(多表关联)和视图簇(导航式维护)三种维护对象类型。使用TMG前需注意三个关键设置:1)表维护权限选项;2)交付类(决定数据传输行为);3)客户端字段配置。通过SE54/SE11生成维护对话框时,需选择维护类型(一步/两步)和记录例程(控制传输)。TMG生成的对象包含函数组、屏幕和处理模块,但部分标准框架不可修改。实际应用中,可通过参数事

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 176

Kafka 入门篇(一)

初识 Kafka 什么是 Kafka Kafka 的基本术语 Kafka 的特性(设计原则) Kafka 的使用场景 Kafka 的消息队列 点对点模式的消息队列 发布-订阅模式的消息队列 Kafka 系统架构 核心 API Kafka 为何如此之快 broker 端配置 broker.id port zookeeper.connect log.dirs num.recovery.threads.per.data.dir auto.create.topics.enable topic默认配置 num.par

1234

设计模式C++实现(1)——(创建型)工厂模式

一 工厂模式 软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。最近看设计模式的书,对于每个模式,用C++写了个小例子,加深一下理解。主要参考《大话设计模式》和《设计模式:可复用面向对象软件的基础》两本书。本文介绍工厂模式的实现。 工厂模式属于创建型模式,大致可以分为三类,简单工厂模式、工厂方法模式、抽象工厂模式。听上去差不多,都是工厂模式。下...

学海无涯 456

【2025软考高级架构师】基础知识部分——6、软件架构设计

(1)架构是对系统的抽象(2)架构由多个结构组成(3)任何软件都存在架构(4)元素及其行为的集合构成架构的内容(5)架构具有“基础”性(6)架构隐含有“决策”

qq837993702的博客 1万+
上一篇: 各种音视频编解码学习详解
下一篇: 设计模式C++实现(2)——策略模式
tspangle
博客等级 码龄19年 81粉丝 88原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值