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

设计模式--工厂模式(Factory Pattern)

一、 什么是工厂模式

工厂模式(Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的接口,但是将对象的实例化过程推迟到子类中。工厂模式允许通过调用一个共同的接口方法来创建不同类型的对象,而无需暴露对象的实例化逻辑。

工厂模式的主要目标是解耦对象的创建和使用,以及提供一种更灵活的方式来管理对象的实例化。通过使用工厂模式,可以轻松添加新类型的对象,而不会影响到已有的代码。

工厂模式通常涉及以下几个核心角色:

  1. 产品(Product):这是一个抽象类或接口,定义了所创建对象的通用接口。
  2. 具体产品(Concrete Product):这些是实现了产品接口的具体类,它们是工厂方法模式的创建目标。
  3. 工厂(Factory):这是一个抽象类或接口,定义了创建对象的接口方法。工厂类通常是一个创建具体产品对象的工厂方法。
  4. 具体工厂(Concrete Factory):这些是实现了工厂接口的具体类,它们负责实例化具体的产品对象。

工厂模式可以分为三种常见的变体:

  1. 简单工厂模式(Simple Factory Pattern):通过一个共同的工厂类来创建对象,客户端只需传递一个参数来指定所需的对象类型。虽然不是严格意义上的设计模式,但它是工厂模式的基础。
  2. 工厂方法模式(Factory Method Pattern):定义一个工厂接口,具体的工厂子类负责实现工厂接口并创建对象。每个具体工厂对应一个特定的产品。
  3. 抽象工厂模式(Abstract Factory Pattern):提供了一种创建一系列相关或相互依赖对象的接口,而无需指定具体类。适用于创建一组相互关联的产品。

二、简单工厂模式的代码样例

简单工厂模式(Simple Factory Pattern)虽然不是严格的设计模式,但它是工厂模式的一种基本形式,适用于创建单一类别的对象。在简单工厂模式中,有一个工厂类负责根据客户端的请求创建不同类型的对象。

以下是一个用C++实现简单工厂模式的示例:

#include <iostream>// 抽象产品类
class Product {
public:virtual void operation() = 0;
};// 具体产品类A
class ConcreteProductA : public Product {
public:void operation() override {std::cout << "ConcreteProductA operation." << std::endl;}
};// 具体产品类B
class ConcreteProductB : public Product {
public:void operation() override {std::cout << "ConcreteProductB operation." << std::endl;}
};// 简单工厂类
class SimpleFactory {
public:// 根据传入的参数创建不同类型的产品对象static Product* createProduct(char type) {if (type == 'A') {return new ConcreteProductA();} else if (type == 'B') {return new ConcreteProductB();} else {return nullptr; // 可以抛出异常或其他处理}}
};int main() {// 客户端通过工厂创建产品Product* productA = SimpleFactory::createProduct('A');Product* productB = SimpleFactory::createProduct('B');if (productA) {productA->operation();delete productA;}if (productB) {productB->operation();delete productB;}return 0;
}

在这个例子中,我们定义了一个抽象产品类 Product,然后有两个具体的产品类 ConcreteProductA 和 ConcreteProductB。简单工厂类 SimpleFactory 有一个静态方法 createProduct,根据传入的参数来创建不同类型的产品对象。

虽然简单工厂模式简化了对象的实例化,但它的弊端在于如果需要添加新类型的产品,就需要修改工厂类的代码。因此,当需要支持更多产品类型时,更推荐使用工厂方法模式或抽象工厂模式。

三、工厂方法模式的代码样例

工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但是将具体的对象实例化推迟到子类中。每个具体的工厂子类负责创建特定类型的对象。这种模式使得客户端代码与具体创建对象的代码分离,实现了松耦合。

以下是一个用C++实现工厂方法模式的示例:

#include <iostream>// 抽象产品类
class Product {
public:virtual void operation() = 0;
};// 具体产品类A
class ConcreteProductA : public Product {
public:void operation() override {std::cout << "ConcreteProductA operation." << std::endl;}
};// 具体产品类B
class ConcreteProductB : public Product {
public:void operation() override {std::cout << "ConcreteProductB operation." << std::endl;}
};// 抽象工厂类
class Factory {
public:virtual Product* createProduct() = 0;
};// 具体工厂类A
class ConcreteFactoryA : public Factory {
public:Product* createProduct() override {return new ConcreteProductA();}
};// 具体工厂类B
class ConcreteFactoryB : public Factory {
public:Product* createProduct() override {return new ConcreteProductB();}
};int main() {// 客户端通过具体工厂来创建产品Factory* factoryA = new ConcreteFactoryA();Product* productA = factoryA->createProduct();productA->operation();delete factoryA;delete productA;Factory* factoryB = new ConcreteFactoryB();Product* productB = factoryB->createProduct();productB->operation();delete factoryB;delete productB;return 0;
}

在这个例子中,我们定义了一个抽象产品类 Product,然后有两个具体的产品类 ConcreteProductA 和 ConcreteProductB。抽象工厂类 Factory 定义了一个纯虚函数 createProduct,由具体的工厂子类来实现该方法并创建特定类型的产品对象。

客户端使用具体的工厂类来创建产品,这样客户端代码与具体的产品创建代码分离,实现了解耦。工厂方法模式允许通过添加新的工厂子类来支持新的产品类型,而无需修改现有的代码。

四、抽象工厂模式的代码样例

抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供一个接口用于创建一系列相关或相互依赖的对象,而无需指定具体类。抽象工厂模式适用于需要创建一组相互关联的产品的情况,它将一组相关的工厂类封装起来。

以下是一个用C++实现抽象工厂模式的示例:

#include <iostream>// 抽象产品类A
class AbstractProductA {
public:virtual void operationA() = 0;
};// 具体产品类A1
class ConcreteProductA1 : public AbstractProductA {
public:void operationA() override {std::cout << "ConcreteProductA1 operation." << std::endl;}
};// 具体产品类A2
class ConcreteProductA2 : public AbstractProductA {
public:void operationA() override {std::cout << "ConcreteProductA2 operation." << std::endl;}
};// 抽象产品类B
class AbstractProductB {
public:virtual void operationB() = 0;
};// 具体产品类B1
class ConcreteProductB1 : public AbstractProductB {
public:void operationB() override {std::cout << "ConcreteProductB1 operation." << std::endl;}
};// 具体产品类B2
class ConcreteProductB2 : public AbstractProductB {
public:void operationB() override {std::cout << "ConcreteProductB2 operation." << std::endl;}
};// 抽象工厂类
class AbstractFactory {
public:virtual AbstractProductA* createProductA() = 0;virtual AbstractProductB* createProductB() = 0;
};// 具体工厂类1
class ConcreteFactory1 : public AbstractFactory {
public:AbstractProductA* createProductA() override {return new ConcreteProductA1();}AbstractProductB* createProductB() override {return new ConcreteProductB1();}
};// 具体工厂类2
class ConcreteFactory2 : public AbstractFactory {
public:AbstractProductA* createProductA() override {return new ConcreteProductA2();}AbstractProductB* createProductB() override {return new ConcreteProductB2();}
};int main() {// 客户端通过具体工厂来创建一组相关的产品AbstractFactory* factory1 = new ConcreteFactory1();AbstractProductA* productA1 = factory1->createProductA();AbstractProductB* productB1 = factory1->createProductB();productA1->operationA();productB1->operationB();delete factory1;delete productA1;delete productB1;AbstractFactory* factory2 = new ConcreteFactory2();AbstractProductA* productA2 = factory2->createProductA();AbstractProductB* productB2 = factory2->createProductB();productA2->operationA();productB2->operationB();delete factory2;delete productA2;delete productB2;return 0;
}

在这个例子中,我们定义了两组相关的产品类:AbstractProductA 和 AbstractProductB,然后分别有两个具体的产品类。抽象工厂类 AbstractFactory 定义了两个纯虚函数,分别用于创建 AbstractProductA 和 AbstractProductB 对象。具体的工厂类 ConcreteFactory1 和 ConcreteFactory2 实现了这些方法,并创建特定类型的产品对象。

通过使用抽象工厂模式,客户端可以通过具体的工厂来创建一组相关的产品,实现了一种创建一系列相互关联产品的方式。这有助于实现高内聚、低耦合的设计。

五、三种工厂模式之间的关系

这三种工厂模式(简单工厂模式、工厂方法模式和抽象工厂模式)都是创建型设计模式,旨在解决对象的创建问题。它们之间有一些共同点,但也存在一些差异。下面是它们之间的关系和区别:

共同点:

  • 都关注对象的创建,封装了对象的实例化过程,使客户端代码与具体创建逻辑分离。
  • 都遵循了开闭原则,即可以通过添加新的产品类或工厂类来扩展功能,而无需修改现有代码。

差异:

  • 简单工厂模式:虽然不是严格意义上的设计模式,但它是工厂模式的基础。它通过一个共同的工厂类来创建不同类型的对象,客户端根据参数来指定对象类型。适用于创建单一类别的对象。
  • 工厂方法模式:定义了一个工厂接口,由具体的工厂子类来实现工厂接口并创建特定类型的产品对象。每个工厂只负责创建一种产品。适用于创建一组相关的产品,每个产品有一个对应的工厂。
  • 抽象工厂模式:提供了一种创建一组相关或相互依赖对象的接口,每个具体的工厂子类负责创建一组相关产品。适用于创建一组相互关联的产品,每组产品都有一个对应的工厂。

适用场景:

  • 简单工厂模式适用于创建简单的对象,例如基于传入参数创建对象的情况。
  • 工厂方法模式适用于需要创建多种具有相同接口的产品,而且每种产品都有对应的工厂。
  • 抽象工厂模式适用于创建一组相关或相互依赖的产品,且每组产品都有对应的工厂。

总之,这三种工厂模式都在不同情况下提供了灵活的对象创建机制,可以根据具体的需求来选择合适的模式。简单工厂模式通常是基础,而工厂方法模式和抽象工厂模式则在更复杂的场景下提供更大的灵活性。

在这里插入图片描述

相关文章:

设计模式--工厂模式(Factory Pattern)

一、 什么是工厂模式 工厂模式&#xff08;Factory Pattern&#xff09;是一种创建型设计模式&#xff0c;它提供了一种创建对象的接口&#xff0c;但是将对象的实例化过程推迟到子类中。工厂模式允许通过调用一个共同的接口方法来创建不同类型的对象&#xff0c;而无需暴露对…...

【Android】 No matching variant of com.android.tools.build:gradle:[版本号] was found

项目报错 No matching variant of com.android.tools.build:gradle:8.1.1 was found. The consumer was configured to find a library for use during runtime, compatible with Java 8, packaged as a jar, and its dependencies declared externally, as well as attribute …...

650V 1200V碳化硅二极管MOS管规格书参数,6A 8A 10A 15A 20A 封装TO220低VF电压 低内阻特性

650V碳化硅二极管6A 8A 15A提供样品 650V 40毫欧超结COOL MOS提供样品 650V 超结COOL MOS资料 国产替代 650V 1200V碳化硅二极管技术资料...

python基础—python6种基本数据类型及数据类型之间转换

文章目录 一、python标准数据类型&#xff08;一&#xff09;数字类型整型&#xff1a;int浮点型&#xff1a;flaot布尔型&#xff1a;bool复数类型&#xff1a;complex &#xff08;二&#xff09;字符串&#xff08;三&#xff09;列表类型&#xff08;四&#xff09;元组类型…...

Axure RP

Axure RP 简介下载安装汉化注册 简介 Axure RP&#xff08;Rapid Prototyping&#xff09;是一款交互式原型设计工具&#xff0c;用于创建高保真的交互式界面原型和线框图。它主要用于用户体验&#xff08;UX&#xff09;和用户界面&#xff08;UI&#xff09;设计&#xff0c…...

java使用ExcelExportUtil.exportBigExcel导出大文件(非分页)

网上看到很多使用这个方法处理的时候&#xff0c;大多使用的分页进行查询&#xff0c;但是当遇到特殊的产品需求&#xff0c;比如A类型数据&#xff0c;多条记录就显示多行&#xff0c;B类型的要求存在多条记录时&#xff0c;就进行汇总后只显示一条&#xff0c;这就导致无法使…...

PlantUML文本绘制类图

记录下文本绘制类图的语法 参考 https://juejin.cn/post/6844903731293585421 类的UML表示 使用UML表示一个类&#xff0c;主要由三部分组成。类名、属性、方法。其中属性和方法的访问修饰符用 - 、# 、 表示 private、protected、public。 如图所示&#xff0c;表示A类有一个…...

5分钟理解NPL算法 之 马尔可夫链 Markov Chain

马尔可夫链&#xff08;Markov Chain&#xff09; 马尔可夫链是一种简单的推理模型。用于描述受当前事件影响下的下一事件发生概率。在预测学科中广泛应用。例如股票预测、文字推理、路线推荐等。 他的核心思路是&#xff1a;假设事件顺序为: X 1 , X 2 , X 3 , . . . . . X…...

C#_GDI+ 绘图编程入门

官网提供相关API GDI 基本图形功能_drawing 高级二维和矢量图形功能_drawing2D GDI 图像处理功能_Imaging GDI 排版功能_text Windows 窗体应用程序提供打印功能_Printing 像素 构成图像的最小单位就是像素&#xff1b;屏幕上显示不管是位图或者矢量图&#xff0c;当描述…...

自己写一个svg转化为安卓xml的工具类

自己写一个svg转化为安卓xml的工具类_张风捷特烈的博客-CSDN博客 svg资源阿里巴巴矢量资源网站:iconfont-阿里巴巴矢量图标库 感觉一般的svg到Android可用的xml差异有点规律&#xff0c;主要的就是path 秉承着能用代码解决的问题&#xff0c;绝对不动手。能够靠智商解决的问题…...

基于随机森林的机器启动识别,基于随机森林的智能家居电器启动识别

目录 背影 摘要 随机森林的基本定义 随机森林实现的步骤 基于随机森林的机器启动识别 代码下载链接: 基于随机森林的家用电器启动识别,基于RF的电器启动识别,基于随机森林的智能家居启动检测-深度学习文档类资源-CSDN文库 https://download.csdn.net/download/abc991835105/…...

Apache Doris 极简运维之BE扩缩容(1)

Apache Doris 极简运维之BE扩缩容&#xff08;1&#xff09; 一、环境信息硬件信息软件信息 二、缩容2.1 DROP BACKEND缩容2.2 DECOMMISSION BACKEND缩容2.2.1 缩容前2.2.2 缩容中2.2.3 缩容后 三、扩容3.1 扩容前3.2 扩容中3.3 扩容后 四、总结 一、环境信息 已部署三个BE节点…...

MySQL每日一练--校园教务系统

一丶数据库名称&#xff1a;SchoolDB 二丶数据库表信息&#xff1a;角色信息表 表名&#xff1a; t_role 主键&#xff1a; r_id 序号 字段名称 字段说明 类别 位数 属性 备注 1 r_id 角色编号 int 主键 自动增长 2 r_name_EN 角色名&#xff08;英…...

9.阿里Sentinel哨兵

1.Sentinel Sentinel&#xff08;哨兵&#xff09;是由阿里开源的一款流量控制和熔断降级框架&#xff0c;用于保护分布式系统中的应用免受流量涌入、超载和故障的影响。它可以作为微服务架构中的一部分&#xff0c;用于保护服务不被异常流量冲垮&#xff0c;从而提高系统的稳定…...

设计模式之工厂方法模式

目录 工厂方法模式 简介 优缺点 结构 使用场景 实现 1.抽象产品 2.具体产品 3.抽象工厂 4.具体工厂 5.调用 总结 抽象工厂模式 简介 结构 实现 区别 工厂方法模式 简介 提供一个用于创建对象的接口(工厂接口)&#xff0c;让其实现类(工厂实现类)决定实例化哪…...

【案例教程】基于R语言的物种气候生态位动态量化与分布特征模拟

在全球气候快速变化的背景下&#xff0c;理解并预测生物种群如何应对气候变化&#xff0c;特别是它们的地理分布如何变化&#xff0c;已经变得至关重要。利用R语言进行物种气候生态位动态量化与分布特征模拟&#xff0c;不仅可以量化描述物种对环境的需求和适应性&#xff0c;预…...

Moonbeam生态跨链互操作项目汇总

立秋已过&#xff0c;今年的夏天已经接近尾声&#xff0c;即将迎来凉爽的秋天。Moonbeam生态一同以往持续成长&#xff0c;在8月也举办了不少活动、完成集成合作以及协议更新。让我们一同快速了解Moonbeam生态项目近期发生的大小事件吧&#xff01; Moonwell Moonwell是一个建…...

基于社会群体算法优化的BP神经网络(预测应用) - 附代码

基于社会群体算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于社会群体算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.社会群体优化BP神经网络2.1 BP神经网络参数设置2.2 社会群体算法应用 4.测试结果&#xff1a;5…...

208. 实现 Trie (前缀树)

题目描述 Trie&#xff08;发音类似 “try”&#xff09;或者说 前缀树 是一种树形数据结构&#xff0c;用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景&#xff0c;例如自动补完和拼写检查。 请你实现 Trie 类&#xff1a; Trie() 初始化前缀树对…...

adb使用总结

adb连接到模拟器 adb devices 打开模拟器&#xff0c;找到设置。 多次点击版本号&#xff0c;切换到开发者模式 搜索进入开发者选项 开启USB调试 此时在终端输入adb devices就连接上了 使用adb查看安卓手机架构 adb shell getprop ro.product.cpu.abi 进入安卓手机的shell …...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...

通过MicroSip配置自己的freeswitch服务器进行调试记录

之前用docker安装的freeswitch的&#xff0c;启动是正常的&#xff0c; 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...

五子棋测试用例

一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏&#xff0c;有着深厚的文化底蕴。通过将五子棋制作成网页游戏&#xff0c;可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家&#xff0c;都可以通过网页五子棋感受到东方棋类…...