不得不说的创建型模式-工厂方法模式

news2024/11/20 8:30:14

 

工厂方法模式是创建型模式之一,它定义了一个用于创建对象的接口,但将具体创建的过程延迟到子类中进行。换句话说,它提供了一种通过调用工厂方法来实例化对象的方法,而不是通过直接使用 new 关键字来实例化对象。

 

下面是一个使用 C++ 实现工厂方法模式的例子:

在上述代码中,有一个抽象产品类 Product,两个具体产品类 ConcreteProductAConcreteProductB,一个抽象工厂类 Factory,两个具体工厂类 ConcreteFactoryAConcreteFactoryBFactory 类中包含一个工厂方法 createProduct(),用于创建产品对象。具体的产品对象的创建延迟到了具体的工厂类中,这也就是工厂方法模式的核心思想。

底层原理:工厂方法模式中的工厂方法实际上就是一个虚函数,由具体的工厂类来实现该虚函数,返回具体的产品对象。客户端只需要知道具体的工厂类,然后通过调用工厂方法来获得具体的产品对象,而无需知道产品对象的具体实现过程。

实际应用:工厂方法模式常用于需要创建多种对象的场景,例如创建不同类型的窗口、按钮、对话框等 GUI 控件。在工

厂方法模式中,我们可以通过定义不同的具体工厂类来创建不同的具体产品对象,从而使得客户端代码与具体产品类的实现分离,提高了系统的灵活性和可维护性。

另外,工厂方法模式也可以与其他设计模式一起使用,例如抽象工厂模式、单例模式等。抽象工厂模式可以用来创建一组相关的对象,而单例模式可以用来保证工厂对象的唯一性。

总的来说,工厂方法模式是一种非常常用的设计模式,在实际的软件开发中经常用来创建具有多种不同类型的对象。它提供了一种灵活的方式来创建对象,同时也可以提高系统的扩展性和可维护性。

工厂方法模式的优点:

  1. 通过工厂方法来创建对象,客户端与具体产品的实现相分离,从而降低了耦合性,提高了系统的可扩展性和可维护性。
  2. 可以通过增加新的具体工厂类来扩展系统的功能,符合开闭原则。
  3. 可以使用多态性来实现工厂方法,也可以使用模板类来实现工厂方法,提高了代码的复用性和灵活性。

工厂方法模式的缺点:

  1. 需要定义很多的具体工厂类,增加了系统的复杂度。
  2. 在创建对象时,可能需要传递大量的参数,从而增加了代码的复杂度。

工厂方法模式的适用场景:

  1. 当一个类不知道它所需要的对象的类时。
  2. 当一个类希望由它的子类来指定所创建的对象时。
  3. 当类将创建对象的职责委托给多个辅助子类中的某一个,并且希望将哪一个辅助子类是代理者这一信息局部化时。

总的来说,工厂方法模式是一种简单而又实用的设计模式,它将对象的创建过程抽象出来,通过定义工厂方法来创建对象,提高了系统的可扩展性和可维护性。在实际的软件开发中,工厂方法模式经常被使用,例如创建不同类型的数据库连接、日志记录器、配置信息等。

下面是一个使用C++实现工厂方法模式的示例代码:

在上面的代码中,抽象产品类Product定义了产品类的接口,具体产品类ProductA和ProductB实现了该接口,抽象工厂类Factory定义了工厂方法的接口,具体工厂类FactoryA和FactoryB实现了该接口,并重载了createProduct方法来创建具体产品对象。在客户端代码中,通过创建具体工厂对象并调用其createProduct方法来创建具体产品对象,然后使用具体产品对象来完成相应的操作。

在实际应用中,工厂方法模式可以用来创建不同类型的对象,例如创建数据库连接、日志记录器、配置信息等。在实现时,可以使用单例模式来保证工厂对象的唯一性,使用模板类来实现工厂方法,提高代码的复用性和灵活性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/428419.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[架构之路-167]-《软考-系统分析师》-4-据通信与计算机网络-3- 常见局域网与广域网

目录 4 . 3 局域网与广域网 4.3.1 局域网基础知识 1 . 星型结构 2 . 总线结构 3 . 环型结构 4 . 网状结构 4.3.2 以太网技术(接入网) 1 . 以太网基础 2 . 帧结构 3 . 以太网物理层规范 4.3.3 无线局域网(接入网) 1 . …

huggingface TRL是如何实现20B-LLM+Lora+RLHF

huggingface TRL实现20B-LLMLoraRLHFIntroductionWhat is TRL?Training at scale8-bit matrix multiplicationLoraWhat is PEFT?Fine-tuning 20B parameter models with Low Rank Adapter参考Introduction 作者首先表示RLHF在目前LLM的训练中是一种很powerful的方式&#xf…

SpringBoot 整合Quartz定时任务管理【SpringBoot系列18】

SpringCloud 大型系列课程正在制作中,欢迎大家关注与提意见。 程序员每天的CV 与 板砖,也要知其所以然,本系列课程可以帮助初学者学习 SpringBooot 项目开发 与 SpringCloud 微服务系列项目开发 Quartz是由Java语言编写,是OpenSym…

【环境搭建:onnx模型部署】onnxruntime-gpu安装与测试(python)

ONNX模型部署环境创建1. onnxruntime 安装2. onnxruntime-gpu 安装2.1 方法一:onnxruntime-gpu依赖于本地主机上cuda和cudnn2.2 方法二:onnxruntime-gpu不依赖于本地主机上cuda和cudnn2.2.1 举例:创建onnxruntime-gpu1.14.1的conda环境2.2.2 …

Spring整合MyBatis与JUnit

Spring整合 想必到现在我们已经对Spring有一个简单的认识了,Spring有一个容器,叫做IoC容器,里面保存bean。在进行企业级开发的时候,其实除了将自己写的类Spring管理之外,还有一部分重要的工作就是使用第三方的技术。前…

Spring —— Spring Boot 创建和使用

JavaEE传送门JavaEE Spring —— Spring简单的读取和存储对象 Ⅱ Spring —— Bean 作用域和生命周期 目录Spring Boot 创建和使用Spring BootSpring Boot 项目创建使用 IDEA 创建网页版创建Spring Boot 目录介绍运行 Spring Boothello world约定大于配置Spring Boot 创建和使…

关于SeaDAS的安装教程以及使用问题笔记

2022年硕士研究生最后半个学期,已经交完了毕业论文,因为觉得工作以后会用到SeaDAS就拿出了一些时间学习,现在已经工作快一年了,而工作中也并没有用到这个软件,估计以后也不会用到了吧。现在把当时学习整理的一些笔记分…

字符串匹配算法(BFKMP)

个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【数据结构初阶(C实现)】 目录字符串匹配算法BF算法代码实现KMP算法代码实现nextval数组改进字符串匹配算法 在学…

MySQL 库操作

目录 创建数据库 语法 案例 字符集和校验规则(建数据库/建表用) 查看系统默认字符集以及校验规则 db.opt 更改 查看数据库支持的字符集 查看数据库支持的字符集校验规则 校验规则对数据库的影响 排升序 操纵数据库 查看数据库 显示创建语…

[计算机图形学]几何:隐式显式表示(前瞻预习/复习回顾)

一、前言 本篇我们将开启GAMES101几何部分的讲解的第一讲解,也是几何的基本表示,现实中有非常多的几何,如布料,绝对光滑的曲面,水滴,毛发,微观的细胞等等非常复杂的几何,那么如何在…

十分钟在 macOS 快速搭建 Linux C/C++ 开发环境

有一个使用了 Epoll 的 C 项目,笔者平时用的 Linux 主力开发机不在身边,想在 macOS 上开发调试,但是没有 Linux 虚拟机。恰好,JetBrains CLion 的 Toolchains 配置除了使用本地环境,还支持 SSH、Docker。 笔者使用 CL…

Zabbix的介绍与部署

目录 zabbix zabbix简介 zabbix主要功能 zabbix主要特点 zabbix运行机制 zabbix架构 1.sever-client架构 2.sever-proxy-client架构 3.master-node-client架构 如何进行数据采集 zabbix工作原理 zabbix监控模式 安装zabbix5.0 部署zabbix服务端 web页面测试 部…

系统集成项目管理工程师 笔记(第二章:信息系统集成及服务管理)

文章目录2.3.1 ITIL与IT服务管理(ITSM) 117ITSM三个根本目标2.3.2 ITSS与信息技术服务 121ITSS的4个组成要素和5个生命周期2.3.3 信息系统审计 127信息系统审计是建立在以下 4 个理论基础之上的信息系统审计流程示意图审计步骤第2章 信息系统集成及服务管…

怎么设置动态壁纸?这样做就行!

案例:怎么设置动态壁纸 【朋友们,我的壁纸一直都是静态的,最近感觉有点审美疲劳了,想换些好看的动态壁纸,有朋友知道应该如何设置动态壁纸吗?】 经常使用电脑的朋友可能会觉得一直用同一张壁纸会感觉审美…

通过两阶段知识学习多种不利天气排除

论文:Learning Multiple Adverse Weather Removal via Two-stage Knowledge Learning and Multi-contrastive Regularization: Toward a Unified Model【通过两阶段知识学习多种不利天气排除】 论文下载地址:https://openaccess.thecvf.com/content/CVP…

过去的90天,ODC 发生了哪些新的改变?

欢迎访问 OceanBase 官网获取更多信息:https://www.oceanbase.com/ 关于作者 胡智娟 OceanBase 产品经理 主要负责 OceanBase 生态工具数据研发、迁移评估方向的产品工作,在蚂蚁集团有多年数据库管理实战经验,对日常研发及运维痛点有较深感悟…

个人-计算机操作系统第五章

第五章 虚拟存储器 一、章节练习 1.系统抖动是指( )。 A. 使用机器时,千万屏幕闪烁的现象 B. 刚被调出的页面又立刻被调入所形成的频繁调入调出现象 C. 系统盘不净,千万系统不稳定的现象 D. 由于内存分配不当,偶然造成内存不够…

史上最全的快速排序方法--Hoare快排 挖坑法快排 二路快排 三路快排 非递归快排

一.快速排序 1.基本介绍 快速排序(Quicksort)由英国计算机科学家Tony Hoare于1959年发明,是一种经典的排序算法,被广泛应用于计算机科学领域。快速排序(Quick Sort)是一种常见的基于比较的排序算法&#…

阿里云李飞飞:数据库将迎来“四化”趋势

伴随着数字经济的高速发展,越来越多的企业管理者都开始认识到数据才是企业最宝贵的资产,并为此不断加速企业的数字化转型与升级。而在数据库领域,云原生已经当仁不让地成为了当下最炙手可热的技术趋势之一。那么在云原生的时代大潮之下&#…

C++ STL之string容器

目录一、C与C字符串的差别二、string类对象的容量操作三、string类中的常见API总览1.构造2.赋值重载赋值操作符 成员函数 assign3.存取重载下标获取操作符 [ ]成员函数 at4.拼接重载复合操作符 成员函数 append5.查找成员函数 find成员函数 rfind成员函数 replace6.比较成员函数…