设计模式C++实现一 工厂模式

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

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

enum CTYPE {COREA, COREB};   
class SingleCore  
{  
public:  
    virtual void Show() = 0;
};  
//单核A  
class SingleCoreA: public SingleCore  
{  
public:  
    void Show() { cout<<"SingleCore A"<<endl; }  
};  
//单核B  
class SingleCoreB: public SingleCore  
{  
public:  
    void Show() { cout<<"SingleCore B"<<endl; }  
};  
//唯一的工厂,可以生产两种型号的处理器核,在内部判断  
class Factory  
{  
public:   
    SingleCore* CreateSingleCore(enum CTYPE ctype)  
    {  
        if(ctype == COREA) //工厂内部判断  
            return new SingleCoreA(); //生产核A  
        else if(ctype == COREB)  
            return new SingleCoreB(); //生产核B  
        else  
            return NULL;  
    }  
};  

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

       工厂方法模式也有缺点,每增加一种产品,就需要增加一个对象的工厂。如果这家公司发展迅速,推出了很多新的处理器核,那么就要开设相应的新工厂。在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. };   

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

         简单工厂模式的UML图:

         工厂方法的UML图:

         抽象工厂模式的UML图:



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



LLM Wiki 的完整输入体系:LLM Wiki极简实战 LLM Wiki 的输入分为**四大类**,覆盖从"原始知识注入"到"系统行为控制"的全流程,所有输入都遵循"**原始资料不可变,规则可迭代,人类反馈闭环**"的核心原则。 阅读详情

相关推荐

TwinCAT3 Modbus-TCP Client/Server使用

/起始地址是12289//起始地址是12294。

panjinliang066333的博客 7732

Java+Vue+Spring Boot+MySQL编程训练系统毕业设计实战指南

在软件工程实践中,前后端分离架构已成为构建现代Web应用的主流范式。其核心原理在于将用户界面(前端)与业务逻辑和数据(后端)解耦,通过RESTful API进行通信,从而实现关注点分离、提升开发效率和系统可维护性。这种架构模式的技术价值在于支持团队并行开发、便于技术栈选型与独立部署。典型的应用场景包括各类管理后台、电商平台以及在线教育系统。本文聚焦于一个具体的工程实践案例——编程训练系统(OJ),深入剖析如何运用Java、Spring Boot、Vue和MySQL这套主流技术栈,从零开始构建一个功能完整、结

weixin_30838873的博客 602

Aruba无线控制器实战:如何用Client Match优化企业办公区漫游(附SNR调优技巧)

本文深入解析了如何利用Aruba无线控制器的Client Match功能优化企业办公区无线漫游体验。通过实战配置,详细阐述了基于SNR(信噪比)的精细化调优策略,包括阈值设定、负载均衡与场景化参数调整,旨在解决终端粘滞、乒乓漫游等问题,实现智能、平滑的无缝漫游。

weixin_28318011的博客 224

抽象工厂模式

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

day day no bug 1714

Dify+firecrawl:一个超好用的网页转Markdown API,打造你的第一个能检索爬虫RAG知识库的聊天机器人

Firecrawl是一个超简单的API服务——你扔给它一个URL,它就能把整个网站(包括子页面!)的内容自动抓下来,并且转换成干净、易读的Markdown格式。不用配置网站的站点地图,不用写爬虫规则,API调一下,数据直接到手。接下来我们一起本地部署吧!

2501_91673550的博客 2988

Zephyr,设备树概述

Zephyr使用设备树(DTS)描述硬件配置,通过设备树源码和绑定文件生成C头文件供开发使用。设备树采用树状结构,节点对应硬件设备,属性描述硬件特性。示例展示了I2C总线及其外设的节点层级关系,包括单元地址、兼容性标识等关键属性。构建系统将设备树转换为devicetree.h中的宏,使开发者能通过DT_前缀宏访问硬件信息,同时保留Kconfig覆盖默认值的能力。

汽车电子软件领域知识分享 720

实验2 设计模式实验1

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

君临๑的博客 3882

WSOLA原理及matlab仿真

WSOLA原理 对于 OLA 算法来说,常常无法保持原信号中的周期性结构,在帧裁剪的过程中,不能保证每一个帧都能覆盖完整周期并保证其相位对齐,会产生相位跳跃失真。 为保证**基频不变**,就要使用 WSOLA 算法。 WSOLA 并不直接在 Ha 处找一帧进行直接拼接,而是在一个区间内寻找与理想帧最接近的一帧进行叠加。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/8a234f4fde104fc69a9f3ddb7bcf3014.png?x-oss-process=ima

ManiacLook的博客 3214

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

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

weixin_34238633的博客 1340

RagFlow实战:如何用DeepDoc引擎高效处理扫描PDF文档(附完整代码解析)

本文详细解析了如何利用RagFlow的DeepDoc引擎高效处理扫描PDF文档。通过实战演示从环境搭建、PDF预处理、文本检测与识别,到布局分析与表格结构提取的完整流程,并提供了完整的代码实现。该方案超越了传统OCR,能输出保留原始版面信息的结构化数据,为构建高质量知识库提供了强大支持。

weixin_29245767的博客 299

python批量调用大模型API:多线程和异步协程

本文介绍了利用多线程技术批量调用大模型API的实现方法。核心是通过并发请求提高处理效率,主要采用线程池管理并发数量、结果聚合等技术。文章提供了一个完整的Python实现示例,包含APIBatchCaller类及其single_api_call和batch_call方法,详细解析了并发控制、错误处理等关键点,并给出了使用注意事项,包括并发数设置、重试策略和超时处理等。该方案特别适合IO密集型任务,能显著提升批量API调用的效率。

Cachel Wood的博客 759

设计模式之工厂模式

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

czm_ob的博客 1610

2023华为od机试真题【恢复数字序列】C++

2023华为od机试真题【恢复数字序列】C++ 对于一个连续正整数组成的序列,可以将其拼接成一个字符串,再将字符串里的部分字符打乱顺序。如序列8 9 10 11 12,拼接成的字符串为89101112,打乱一部分字符后得到90811211,原来的正整数10就被拆成了0和1。现给定一个按如上规则得到的打乱字符的字符串,请将其还原成连续正整数序列,并输出序列中最小的数字. 输入描述

MISAYAONE的博客 5729

C++实现设计模式(一)之简单工厂模式

目的 通过自己所掌握的C++语言,实现对24种设计模式深刻理解。主要是对每一个模式动机,所具有的角色以及优缺点分析。 一、简单工厂模式 动机 一个工厂类负责所有需要物品。客户端只需要输入某种条件或者触发因子,由工厂负责产生具体某个产品对象。 角色 (1)工厂类Factory:工厂类是用来制负责生产产品。在工厂类中,需要产生对象产品的函数。这个函数能够根据“标识符”的不同生成不同的ConcreteP...

liunanya的博客 225

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

(C++实现)设计模式一:工厂模式

工厂模式: 工厂模式在简单工厂模式的基础上将工厂也抽象为一个抽象工厂,不同的产品放在不同的工厂中取生产(在不同的工厂子类中实例化) #include <iostream> #include <string> #include <time.h> #include <math.h> using namespace std; #define Sam...

像个博客 263

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

(C++实现)设计模式一:简单工厂模式

简单工厂模式: 简单工厂模式非常好理解,很多开发同行甚至在没接触过设计模式就已经使用过这种模式。 简单模式就是将将产品抽象,在一个工厂去判断不同产品的生产(实例化) #include <iostream> #include <string> #include <time.h> #include <math.h> using namespa...

像个博客 298

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

常见的设计模式及其C++实现(一):各种工厂模式

转载地址:https://www.jianshu.com/p/c951adc6aafb我是看《大话设计模式》学的设计模式,书上的例子是用C#写的,并且为了清晰地表达设计模式的优点写的代码很庞大。我这里用C++改写一下,做一下简化,以方便复习和总结,顺带练习一下画UML图。这里可以认为所有的类都是定义在服务端的,而main函数在客户端。简单工厂模式三种工厂模式都是创建型的设计模式。现在有一个工厂要生...

chubu3218的博客 2444

两种语言实现设计模式(C++和Java)(一:工厂模式)

本篇开始记录实现设计模式在工作中的两种常见语言上的实现。 本篇介绍最简单的工厂模式。 工厂模式有一种非常形象的描述,建立对象的类就如一个工厂,而需要被建立的对象就是一个个产品;在工厂中加工产品,使用产品的人,不用在乎产品是如何生产出来的。从软件开发的角度来说,这样就有效的降低了模块之间的耦合。 使用情景: 在不确定会有多少个处理操作时应该考虑使用简单工厂模式,如针对同样的接...

aozhimen9773的博客 229

设计模式的 C++ 实现---工厂方法模式(一)

前文回顾 单例模式(一) 单例模式(二) 观察者模式 简单工厂模式 前言 工厂模式通常适用于需要创建大量对象的情况,若仅需要一个对象,直接 new 即可。 对于简单工厂模式,当需要增加新的产品时,需要对工厂类进行修改,违背了“开闭原则:对修改关闭、对扩展开发”。 工厂方法模式是对简单工厂的进一步抽象和封装。 实现举例 产品抽象基类 class Animal { public: virtual ~Animal(){} virtual void show() = 0; }; 产品派生类

编程猿来如此 267

设计模式C++实现一:简单工厂模式

参考大话设计模式和网上的一些资料,自己编写下一些简单的设计模式,让自己了解这些设计模式的妙处!

shiwazone的专栏 937

大话设计模式C++实现一:简单工厂模式

#include <iostream> #include <cstdlib> using namespace std; class Operation { protected: double numberA; double numberB; public: double getA() { return numberA;...

aichengdi7617的博客 145

设计模式的 C++ 实现---抽象工厂模式(一)

前文回顾 单例模式(一) 单例模式(二) 观察者模式 简单工厂模式 工厂方法模式(一) 工厂方法模式(二) 前言 工厂方法模式中一个工厂只负责生产一种产品,在抽象工厂模式中一个工厂可以生产一系列的产品。 实现举例 场景描述 假设一个简单的数据管理系统:有两个 Student (学生表)和 Grades(分数)两个对象表,一般对于一个对象表需要提供了对数据库操作(增、删、改、查)的类,然而在使用过程中数据库是可能进行更换的,比如 Access 切换到 Oracel。 产品类 ①.Student 类 cl

编程猿来如此 252

设计模式之抽象工厂,C++实现(一)

本部分就说明最简单的抽象工厂实现,当然在实际项目应用中不会这么做,仅为解释该模式。 上图的抽象 工厂有两个工厂,分别生产对应的ProductA和ProductB(可以假想为蓝色或者红色的两种产品A22 = 4) 下面为简单代码示例 // 抽象工厂模式(Abstract Factory),提供一个创建 // 一系列相关或相互依赖对象的接口,而无需指定他们具体的类

长歌行 1551

大话设计模式C++版(简单工厂模式)

  刚开始学设计模式,我选择的是大家都喜欢的大话设计模式,但是个人偏好C++,所以想要模仿C#版来做自己的C++版,这是第一个设计模式,简单工厂模式,虽然是很简单的模式,但是对于C++不是吃得很透的我来说问题还是挺大的,由于+,-,*,/都是继承自同一个父类,所以出现了父类重定义的问题,困扰我很久。后来发现必须要加入#ifndef XXXX #define XXXX最后加上#end来解...

a583911125的博客 184

设计模式(一)之工厂模式(Factory) C++实现

作用:定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。解析:在这个模式中,有两个抽象基类,一个是Product为创建出来的对象的抽象基类,一个是Factory是工厂的抽象基类,在互相协作的时候都是由相应的Factory派生类来生成Product的派生类,也就是说如果要新增一种Product那么也要对应的新增一个Factory,创建的过程

树欲静而风不止 473

设计模式之C++实现(一)---简单工厂模式(Simple Factory)

简单工厂模式又称静态工厂方法模式(Static Factory Method),它不是23种模式之一,但是却是我们常用的设计模式之一。代码先行: 1: // abstract base class 2: class Operation 3: { 4: public: 5: int m_nFirst;

成长的记忆 2481
上一篇: ffmpeg 15条使用命令
下一篇: 设计模式C++实现二 ——策略模式
mengyafei43
博客等级 码龄18年 43粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值