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

 

工厂方法模式是创建型模式之一,它定义了一个用于创建对象的接口,但将具体创建的过程延迟到子类中进行。换句话说,它提供了一种通过调用工厂方法来实例化对象的方法,而不是通过直接使用 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方法来创建具体产品对象,然后使用具体产品对象来完成相应的操作。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

浅理解JavaScript数组去重的方法(划重点),当面试官问如何实现数组去重时,你可以这样做...

文章目录 📋前言🎯什么是数组去重,运用场景是什么?🎯常用的数组去重方法🧩使用 Set 对象🧩使用 Object(对象、基于Hash哈希表) 或 Map🧩使用 filter 方法与 i…

Smartbi电子表格软件架构与差异化特色

Smartbi电子表格软件选择与Excel结合,原因在于Excel一直被模仿,从未被超越。虽然市场上的报表软件很多,但存在太多的不完美。国外的产品功能复杂、难于学习(控件方式),做不了中国式复杂格式的报表&#xff…

Python双向循环链表的操作

目录 一、双向循环链表 双向循环链表图 二、双向循环链表的操作 1、判断链表是否为空 2,链表长度 3,遍历整个链表 4,在链表头部添加元素 5、链表尾部添加元素 6,在指定位置插入元素 7,修改指定位置的元素 8&a…

VS Code 插件开发概览

VS Code 插件开发概览 前言 VS Code作为开发者的代码开发利器,越来越受开发者的喜爱。像我身边的前端,每天80%的开发工作都是在VS Code上完成的。随着人们对它的使用,不再满足简单的优雅,舒服写代码这一基本需求。有些人利用它进…

阿里ARouter 路由框架解析

一、简介 众所周知,在日常开发中,随着项目业务越来越复杂,项目中的代码量也越来越多,如果维护、扩展、解耦等成了一个非常头疼问题,随之孕育而生的诸如插件化、组件化、模块化等热门技术。 而其中组件化中一项的难点&…

深入理解Linux多线程

致前行的人: 昨日渐多,明日愈少,今日还在,不要为成功而努力,要为做一个有价值的人而努力。人生道路上充满了坎坷,谁也不可能一帆风顺。只有在最困难的时刻,才能体会到无助的含义。 目录 1.理解…

SpringBoot集成MyBatis-yml自动化配置原理详解

SpringBoot集成MyBatis-yml自动化配置原理详解 简介:spring boot整合mybatis开发web系统目前来说是市面上主流的框架,每个Java程序和springboot mybatis相处的时间可谓是比和自己女朋友相处的时间都多,但是springboot mybatis并没有得到你的真…

适用于 Windows 的 5 个最好的 PDF 转换器应用程序

由于稳定性、高分辨率、高安全性、易于传输等特点,PDF已经成为我们日常工作中最常用的格式。我们在享受PDF带来便利的同时,也发现PDF带来了一些不便,其中最大的问题就是PDF内容的编辑难度。同时,并不是所有的文件都是PDF格式的&am…

代码优化- 前端优化

常量折叠 基本思想:在编译期间计算表达式的值(编译时静态计算) 例如:a 3 5 > a 8,if (true && false) ... > if (false) 好处是:语法树的节点数量减少了,意味着编译器要维护…

Ubuntu上跑通PaddleOCR

书接上文。刚才说到我已经在NUC8里灌上了Windows Server 2019。接下来也顺利的启用了Hyper-V角色并装好了一台Ubuntu 22.04 LTS 的虚机。由于自从上回在树莓派上跑通了Paddle-Lite-Demo之后想再研究一下PaddleOCR但进展不顺,因此决定先不折腾了,还是从x6…

【论文写作】如何写科技论文?万能模板!!!(以IEEE会议论文为例)

0. 写在前面 常言道,科技论文犹如“八股文”,有固定的写作模式。本篇博客主要是针对工程方面的论文的结构以及写作链条的一些整理,并不是为了提高或者润色一篇论文的表达。基本上所有的论文,都需要先构思好一些点子,有…

一文搞懂Session和JWT登录认证

前言 目前在开发的小组结课项目中用到了JWT认证,简单分享一下,并看看与Session认证的异同。 登录认证(Authentication)的概念非常简单,就是通过一定手段对用户的身份进行确认。 我们都知道 HTTP 是无状态的&#xf…

强化学习技巧

此软件包处于维护模式,请使用Stable-Baselines3 (SB3)获取最新版本。您可以在 SB3 文档中找到迁移指南。 本节的目的是帮助您进行强化学习实验。它涵盖了有关 RL 的一般建议(从哪里开始、选择哪种算法、如何评估算法等),以及使用自…

【Linux】System V 共享内存、消息队列、信号量

🍎作者:阿润菜菜 📖专栏:Linux系统编程 system V共享内存介绍 System V 共享内存是一种进程间通信的机制,它允许多个进程共享一块物理内存区域(称为“段”)。System V 共享内存的优点是效率高&…

OTG是什么意思?

OTG是什么意思? OTG是怎么样实现的? TYPE-C接口的手机如何实现同时充电OTG功能? OTG是什么意思? OTG是On-The-Go的缩写,是一项新兴技术,主要应用于不同的设备或移动设备间的联接,进行数据交…

基于遥感的自然生态环境检测——实验三:生态因子提取

实验三:生态因子提取 一、实验目标 生态因子生成;生态因子归一化;生态环境评价 二、实验内容 根据经过大气校正后的影像生产土地覆盖指数、土壤指数以及坡度等,对土地覆盖指数、土壤指数以及坡度进行密度分割归一化&#xff1…

“SCSA-T学习导图+”系列:下一代防火墙

本期引言: 近年来,随着数字化业务带给我们高效和便捷的同时,信息暴露面的增加、网络边界的模糊化以及黑客攻击的产业化,使得网络安全事件相较以往成指数级增加。传统防火墙基于五元组的方式对进出网络的数据流量进行访问控制&…

JavaScript(JS)-1.JS基础知识

1.JavaScript概念 (1)JavaScript是一门跨平台,面向对象的脚本语言,来控制网页行为的,它能使网页可交互 (2)W3C标准:网页主要由三部分组成 ①结构:HTML负责网页的基本结构(页面元素和内容)。 …

【Linux网络服务】Linux网络设置

一、查看网络配置 1.1ifconfig 1.2ip a 1.3什么是mtu 最大传输单元MTU,是指网络能够传输的最大数据包大小,以字节为单位。MTU的大小决定了发送端一次能够发送报文的最大字节数。如果MTU超过了接收端所能够承受的最大值,或者是超过了发送路径…

EIGRP 配置,详解拓扑表,路由汇聚

1.3 EIGRP 拓扑,路由以及汇聚 1.3.1 实验目的 通过对 EIGRP 拓扑,路由以及汇聚相关实验的练习,掌握 EIGRP 建立拓扑信息的方式, 度量计算方法,如何调整度量,非等价负载均衡,以及 EIGRP 末节路…