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

【设计模式】工厂模式总结

工厂模式

定义一个创建对象的接口,让子类决定实例化哪个类,而对象的创建统一交由工厂去生产。

工厂模式大致可以分为三类:简单工厂模式、工厂方法模式、抽象工厂模式

简单工厂模式

简单工厂模式提供一个工厂类,根据传入的参数来创建不同类型的对象,而客户端代码无需了解对象的创建过程。

#include <iostream>// 基类,所有图形对象的父类
class Shape {
public:virtual void draw() = 0;
};// 具体的圆形类
class Circle : public Shape {
public:void draw() {std::cout << "Draw a circle" << std::endl;}
};// 具体的矩形类
class Rectangle : public Shape {
public:void draw() {std::cout << "Draw a rectangle" << std::endl;}
};// 简单工厂类
class ShapeFactory {
public:// 根据传入的参数创建不同类型的图形对象Shape* createShape(const std::string& shapeType) {if (shapeType == "circle") {return new Circle();} else if (shapeType == "rectangle") {return new Rectangle();} else {return nullptr; // 可以添加错误处理逻辑}}
};int main() {ShapeFactory factory;// 创建圆形对象Shape* circle = factory.createShape("circle");if (circle) {circle->draw();delete circle;}return 0;
}

缺点:增加新类型时需要修改工厂类,违反开闭原则。

工厂方法模式

工厂方法模式定义了一个创建对象的接口,但将具体对象的创建交给子类来实现。

#include <iostream>
#include <string>// 抽象产品类:文档
class Document {
public:virtual void open() = 0;virtual void save() = 0;
};// 具体产品类:PDF 文档
class PDFDocument : public Document {
public:void open() {std::cout << "Opening a PDF document" << std::endl;}void save() {std::cout << "Saving a PDF document" << std::endl;}
};// 具体产品类:文本文档
class TextDocument : public Document {
public:void open() {std::cout << "Opening a Text document" << std::endl;}void save() {std::cout << "Saving a Text document" << std::endl;}
};// 抽象工厂类
class DocumentFactory {
public:virtual Document* createDocument() = 0;
};// 具体工厂类:PDF 文档工厂
class PDFDocumentFactory : public DocumentFactory {
public:Document* createDocument() {return new PDFDocument();}
};// 具体工厂类:文本文档工厂
class TextDocumentFactory : public DocumentFactory {
public:Document* createDocument() {return new TextDocument();}
};int main() {DocumentFactory* factory = nullptr;Document* doc = nullptr;// 创建 PDF 文档factory = new PDFDocumentFactory();doc = factory->createDocument();doc->open();doc->save();delete doc;delete factory;// 创建文本文档factory = new TextDocumentFactory();doc = factory->createDocument();doc->open();doc->save();delete doc;delete factory;return 0;
}

优点: 扩展性好,符合了开闭原则, 新增一种产品时,只需增加改对应的产品类和对应的工厂子类即可。

缺点:每增加一种新类型,就需要增加一个对象的工厂; 相比简单工厂模式,工厂方法模式需要更多的类定义。

抽象工厂模式

抽象工厂模式允许你创建一系列相关的对象,而不指定具体的类。

#include <iostream>
#include <string>// 抽象产品类:按钮
class Button {
public:virtual void render() = 0;
};// 具体产品类:Windows按钮
class WindowsButton : public Button {
public:void render() {std::cout << "Rendering a Windows button" << std::endl;}
};// 具体产品类:Linux按钮
class LinuxButton : public Button {
public:void render() {std::cout << "Rendering a Linux button" << std::endl;}
};// 抽象产品类:窗口
class Window {
public:virtual void createButton() = 0;
};// 具体产品类:Windows窗口
class WindowsWindow : public Window {
public:void createButton() {Button* button = new WindowsButton();button->render();}
};// 具体产品类:Linux窗口
class LinuxWindow : public Window {
public:void createButton() {Button* button = new LinuxButton();button->render();}
};// 抽象工厂类
class GUIFactory {
public:virtual Window* createWindow() = 0;
};// 具体工厂类:Windows工厂
class WindowsGUIFactory : public GUIFactory {
public:Window* createWindow() {return new WindowsWindow();}
};// 具体工厂类:Linux工厂
class LinuxGUIFactory : public GUIFactory {
public:Window* createWindow() {return new LinuxWindow();}
};int main() {GUIFactory* factory = nullptr;Window* window = nullptr;// 创建Windows风格的窗口和按钮factory = new WindowsGUIFactory();window = factory->createWindow();delete factory;// 创建Linux风格的窗口和按钮factory = new LinuxGUIFactory();window = factory->createWindow();delete factory;return 0;
}

优点: 工厂抽象类创建了多个类型的产品,当有需求时,可以创建相关产品子类和子工厂类来获取。

缺点: 需要在抽象工厂类中提前确定可能需要的产品种类,以满足不同型号的多种产品的需求;如果我们需要的产品种类并没有在抽象工厂类中提前确定,则需要修改抽象工厂类了,以及所有的工厂子类。

相关文章:

【设计模式】工厂模式总结

工厂模式 定义一个创建对象的接口&#xff0c;让子类决定实例化哪个类&#xff0c;而对象的创建统一交由工厂去生产。 工厂模式大致可以分为三类&#xff1a;简单工厂模式、工厂方法模式、抽象工厂模式。 简单工厂模式 简单工厂模式提供一个工厂类&#xff0c;根据传入的参…...

网络安全管理员高级工理论题库(持续更新中)

一. 单选题&#xff08;共16题&#xff09; 1.【单选题】职业是由于社会分工和生产内部的&#xff08;&#xff09;而形成的具有特定专业和专门职责的工作。 A、劳动分工 B、智力分工 C、生产分工 D、社会分工 正确答案&#xff1a;A 2.【单选题】职业是在人类社会出现分工之后…...

RestTemplate配置和使用

在项目中&#xff0c;如果要调用第三方的http服务&#xff0c;就需要发起http请求&#xff0c;常用的请求方式&#xff1a;第一种&#xff0c;使用java原生发起http请求&#xff0c;这种方式不需要引入第三方库&#xff0c;但是连接不可复用&#xff0c;如果要实现连接复用&…...

【Hadoop】YARN容量调度器详解

&#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,Java基础学习,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341; &#x1fa81;&#x1f341;&am…...

20个Python实用小技巧!来自十年老程序员的推荐~

文章目录 1.用itertools排列2.单行条件表达式3. 反转字符串4. 使用 Assert 处理异常5. 对多个输入使用拆分6. 用 zip() 转置矩阵7. 资源上下文管理器8. 下划线作为分隔符9. 尝试 f 字符串格式10.用这个技巧交换整数11. 使用 lambda 代替函数12.多次打印无循环13. 将字符串解包为…...

jenkins原理篇——成员权限管理

大家好&#xff0c;我是蓝胖子&#xff0c;前面几节我讲述了jenkins的语法以及我是如何使用jenkins对测试和正式环境进行发布的。但正式环境使用jenkins还有一点很重要&#xff0c;那就是权限管理。正式环境的权限往往不能对所有人开放&#xff0c;以及要做到每次发布都是谁在操…...

13.求面积[有问题]

#include<stdio.h> #include<math.h> #include<bits/stdc.h> using namespace std;void fun(double a,b,c) {double p,c;p (abc)/2;c sqrt(p*(p-a)*(p-b)*(p-c));printf("面积是&#xff1a;%lf",c); }int main(){double a,b,c;scanf("%lf,%…...

【力扣】面试经典150题——哈希表

文章目录 383. 赎金信205. 同构字符串290. 单词规律 383. 赎金信 给你两个字符串&#xff1a;ransomNote 和 magazine &#xff0c;判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以&#xff0c;返回 true &#xff1b;否则返回 false 。 magazine 中的每个字符…...

Python批量导入及导出项目中所安装的类库包到.txt文件(补充)

Python批量导入及导出项目中所安装的类库包到.txt文件 生成requirements文件 建议使用&#xff0c;该方式形成文档最简洁&#xff1a; pip list --formatfreeze > requirements.txt...

2023 全栈工程师 Node.Js 服务器端 web 框架 Express.js 详细教程(更新中)

Express 框架概述 Express 是一个基于 Node.js 平台的快速、开放、极简的Web开发框架。它本身仅仅提供了 web 开发的基础功能&#xff0c;但是通过中间件的方式集成了外部插件来处理HTTP请求&#xff0c;例如 body-parser 用于解析 HTTP 请求体&#xff0c;compression 用于压…...

【Leetcode】【数据结构】【C语言】判断两个链表是否相交并返回交点地址

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {struct ListNode *tailAheadA;struct ListNode *tailBheadB;int count10;int count20;//分别找尾节点&#xff0c;并顺便统计节点数量&#xff1a;while(tailA){tailAtailA->next;c…...

Selenium爬取内容并存储至MySQL数据库

前面我通过一篇文章讲述了如何爬取博客摘要等信息。通常,在使用Selenium爬虫爬取数据后,需要存储在TXT文本中,但是这是很难进行数据处理和数据分析的。这篇文章主要讲述通过Selenium爬取我的个人博客信息,然后存储在数据库MySQL中,以便对数据进行分析,比如分析哪个时间段…...

蓝桥等考C++组别六级 007

第一部分&#xff1a;选择题 1、C L6 &#xff08;15分&#xff09; 计算一个正整数除以3的余数&#xff0c;以下选项正确的是&#xff08; &#xff09;。 A. int m; cin >> m; switch (m % 3) { default: cout << "remainder is 1"; break;// 余…...

集合框架:Set集合的特点、HashSet集合的底层原理、哈希表、实现去重复

Set集合的特点 Set&#xff08;集合&#xff09;是一种无序的、不重复的数据结构&#xff0c;它的特点如下&#xff1a; 1. 集合中的元素是无序的&#xff1a;Set 中的元素没有顺序&#xff0c;无法通过索引来访问。 2. 集合中的元素是唯一的&#xff1a;Set 中不允许有重复…...

【T690 之十二】基于方寸EVB2开发板(T690芯片)构建基于GMSSL的文件系统的方式

备注&#xff1a; 1&#xff0c;假设您已对方寸微电子的T690系列芯片的使用方式都有了一定的了解&#xff0c;然后需要构建基于GMSSL的文件系统&#xff0c;此文才对您有意义&#xff1b; 2&#xff0c;若您对方寸微电子的T690芯片不了解&#xff0c;但想进一步了解它&#xff…...

使用Selenium发邮件附件

发邮件可以使用SMTP协议实现程序去发送&#xff0c;但附件的不能太大&#xff0c;一般不超过20M。 以下使用Selenium模拟发送邮件&#xff0c;跳过这个限制&#xff0c;网上找了很多资料&#xff0c;都没有完整实现的&#xff0c;那么自己实现一个&#xff0c;以下代码用Python…...

公共数据这座金矿,授权运营为何是赋能的关键路径?

数据要素市场化正开启下一个关键阶段。 自2014年大数据写入政府工作报告&#xff0c;到全国各地大数据交易所涌现&#xff0c;再到《数据二十条》颁布&#xff0c;中国数据要素产业探索之路已走过近十载。如今&#xff0c;国家大数据局正式成立&#xff0c;更是标志着数据要素…...

昇腾CANN 7.0 黑科技:大模型推理部署技术解密

CANN作为最接近昇腾AI系列硬件产品的一层&#xff0c;通过软硬件联合设计&#xff0c;打造出适合昇腾AI处理器的软件架构&#xff0c;充分使能和释放昇腾硬件的澎湃算力。针对大模型推理场景&#xff0c;CANN最新发布的CANN 7.0版本有机整合各内部组件&#xff0c;支持大模型的…...

OAuth 2.0

OAuth 2.0 是一种授权机制&#xff0c;允许应用程序访问第三方服务的用户数据&#xff0c;而不需要用户提供用户名和密码。其原理包括以下几个步骤&#xff1a; 应用程序向第三方服务请求授权&#xff0c;并提供自己的身份信息。 第三方服务向用户展示授权请求的具体内容和应用…...

7个设计师必备的Figma汉化插件,高效设计超简单!

Figma是一个著名的在线设计工具&#xff0c;拥有来自全球各地的超多设计师都在用&#xff0c;粉丝多多。其强大和灵活的设计功能使许多设计师都喜欢使用它。然而&#xff0c;为了进一步提高设计效率和扩展功能&#xff0c;许多开发人员开发了各种有用的Figma设计的汉化插件。在…...

造相Z-Image文生图模型v2实战应用:电商主图、课件插图、设计提案一键生成

造相Z-Image文生图模型v2实战应用&#xff1a;电商主图、课件插图、设计提案一键生成 1. 为什么选择Z-Image v2进行商业图像创作 在当今内容爆炸的时代&#xff0c;视觉素材的需求量呈指数级增长。传统图像创作方式面临三大痛点&#xff1a;专业设计师成本高昂、版权素材获取…...

RexUniNLU异常检测能力:识别虚假评论与垃圾内容

RexUniNLU异常检测能力&#xff1a;识别虚假评论与垃圾内容 1. 效果惊艳开场 打开任何一个内容平台&#xff0c;评论区总是最热闹的地方。但你可能不知道&#xff0c;每10条评论里&#xff0c;就有2-3条是机器生成的广告、水军刷的好评&#xff0c;或者是纯粹的垃圾信息。这些…...

5分钟搞定DeepSeek API调用:从Postman测试到手机Siri集成全流程

5分钟搞定DeepSeek API调用&#xff1a;从Postman测试到手机Siri集成全流程 在当今快节奏的开发环境中&#xff0c;能够快速集成AI能力已经成为提升工作效率的关键。DeepSeek API作为新一代AI服务接口&#xff0c;以其简洁的调用方式和强大的功能吸引了众多开发者的关注。本文将…...

Lingbot-Depth-Pretrain-ViTL-14 在AIGC领域的应用:为AI生成图像添加深度信息

Lingbot-Depth-Pretrain-ViTL-14 在AIGC领域的应用&#xff1a;为AI生成图像添加深度信息 最近在玩AI生成图片&#xff0c;大家是不是也遇到过这样的困惑&#xff1a;用Stable Diffusion、Midjourney这些工具生成了特别棒的二维画面&#xff0c;但总觉得少了点什么&#xff1f…...

ExpressionUtil实战指南:从基础解析到高级应用

1. ExpressionUtil工具类入门指南 第一次接触ExpressionUtil时&#xff0c;我正被项目中复杂的表达式计算需求困扰。这个工具类就像瑞士军刀一样&#xff0c;帮我解决了各种字符串表达式处理的难题。简单来说&#xff0c;ExpressionUtil是Java开发中处理数学表达式、逻辑判断的…...

零基础实战:揭秘Python漫画下载器高效收藏完整指南

零基础实战&#xff1a;揭秘Python漫画下载器高效收藏完整指南 【免费下载链接】copymanga-downloader 使用python编译exe/bash/命令行参数来下载copymanga(拷贝漫画)中的漫画&#xff0c;支持批量选话下载和获取您收藏的漫画并下载&#xff01;(windows&linux支持&#xf…...

GLM-4.1V-9B-Base行业落地:建筑图纸局部区域语义理解与标注建议

GLM-4.1V-9B-Base行业落地&#xff1a;建筑图纸局部区域语义理解与标注建议 1. 建筑行业的AI视觉理解需求 建筑设计和施工过程中&#xff0c;图纸理解与标注是一项耗时且容易出错的工作。传统方式需要经验丰富的工程师手动识别图纸中的各个元素&#xff0c;不仅效率低下&…...

ofa_image-caption算力适配:A10G云GPU上稳定运行的最小配置方案

ofa_image-caption算力适配&#xff1a;A10G云GPU上稳定运行的最小配置方案 1. 引言 如果你正在寻找一个能自动为图片生成英文描述的本地工具&#xff0c;并且希望它能在消费级显卡上流畅运行&#xff0c;那么基于OFA模型的图像描述生成工具很可能就是你的答案。这个工具最大…...

jsontop.cn使用全攻略:免费无广告的在线工具站,电脑手机通用

你是否经常遇到这些问题&#xff1a; 拿到一堆杂乱 JSON 看不懂&#xff0c;想格式化却不会&#xff1f;需要转 Base64、算 MD5、转时间戳&#xff0c;却要装复杂软件&#xff1f;想测试正则、预览 HTML&#xff0c;还要搭环境、找插件&#xff1f;网上工具全是广告&#xff0…...

探索声发射 b 值:Matlab 程序之旅

声发射b值&#xff0c;Matlab程序在材料科学和岩石力学等领域&#xff0c;声发射&#xff08;Acoustic Emission&#xff0c;AE&#xff09;技术是研究材料内部损伤演化的重要手段。而声发射 b 值作为其中一个关键参数&#xff0c;能反映材料内部微破裂的特征。今天&#xff0c…...