【谈一谈】我们所用的三种工厂模式优缺点

【谈一谈】我们所用的三种工厂模式优缺点

在这里插入图片描述

Hello!!大家好啊,好久也没有进行文章的更新了,原因嘛,最近的工作任务量有点大,导致摸鱼充电的时间大量减少,哈哈哈(你别说,这是借口嘛!)

不过,今天是星期六,难的能够在这里分享下最近在工作中,我用到的三种工厂模式(简工抽),有啥区别呢?,

特别对刚工作小白来说,怎么选择何时用呢?这里为此我特地写篇文章来解决此问题


万变不离其宗

本文总纲:

在这里插入图片描述

三种工厂模式

我们知道工厂模式无非就三种:(简称简工抽)~啥意思?有点迷糊吧?大白话,就是按顺序,越来越复杂!

  1. 简单工厂模式: 一股脑的统统创建出来
  2. 工厂模式:
  3. 抽象工厂模式

~这里知道三种,但是具体啥样的,我们继续往下看:

三种工厂模式异同点:

上面已经做过简单的概括(很精华),但是那样说差别相同,估计你也会懵逼的,

所以我们一起往下探索(就是要刨根问底儿!我们要的就是读完就懂!就牛逼了!哈哈哈)

三者的关系图:

(这个图我是借鉴大佬的哈哈哈)~(你会问:为啥不用自己的啊?,因为自己总结的图没有人家生动易理解)

在这里插入图片描述

1.简单工厂模式

  • 简单工厂模式属于创建型模式,了解过的都知道它又叫Static Factory Method静态工厂方法模式

其实浓缩为一句话: 一个工厂创建所有的具体产品~(这句话,我解释下:)

啥意思呢?

  • 正如其名.简单就简单在此工厂模式:
  • 不管这个产品,后面用还是没用,我都给你在此工厂初始化的时候,
  • 统统一股脑的都创建出来~(就特么问你猛不猛!哈哈,统统就是全部)

说完这些,我们已经知道简单工厂模式七七八八了,我们继续往下看

简单工厂的优点:
  1. 简单(啥也不论,就特么简单!):调用者想创建一个对象,只需知道名称就可以调用
  2. 面向接口化:调用者只用关心产品的接口,对于产品实现等细节进行封装屏蔽
简单工厂缺点:
  1. 不符合开闭原则: 就是你 要增加一个产品,你就要修改原先的工厂类(就是动原先的源码逻辑了)
  2. 违反高内聚责任分配原则: 集中创建了所有的实例

注意: 高内聚低耦合责任分配原则: (这里补充下对此知识的说明)

高内聚低耦合是软件工程中的概念,主要用于面向对象的设计,是判断软件设计好坏的标准

高内聚

  • 是指一个软件模块内的各个元素彼此结合的紧密程度很高,

低耦合

  • 是指软件模块之间依赖程度很低。

高内聚低耦合的目的在于提高软件的可重用性移植性可维护性,增强系统的稳定性、可扩展性和灵活性。

类的角度来看,

  • 高内聚意味着一个类应该只做一件事,并且类的内部方法应该紧密联系,避免一个类中只有一个或很多个方法。
  • 低耦合则意味着类与类之间的关系应该简单明了,避免过强的关系,减少类与类之间的交互复杂度。

2.工厂模式

又叫Ploymorphic Factory–多态工厂模式,属于创建型模式

什么意思(简单复习下)?就是定义一个创建对象的接口,但让实现这个接口的类决定实例化哪个类(就是实例化子类实现)

浓缩一句话: 就是一个工厂方法只创建一个具体产品

此模式支持增加任意产品,新增产品不需要更改之前存在的工厂,只需要此产品对应的工厂(面向一对一,符合开放封闭原则)

优点:

继承简单工厂模式优点: 用户面向接口

符合开放-封闭原则(~这个是最重要的哦!面试回答的关键点)

缺点:

增加了系统的复杂性,不那么简单了:怎么说呢?就是新增一个产品时,需要增加一个对应新的工厂类

3.抽象工厂模式

这玩意没有别名了,哈哈哈(为啥子? 都特么抽象了,还能怎么起~哈哈哈)

复习下: 抽象工厂模式提供一个创建一系列相关或相互依赖对象接口,无需指定具体的类

浓缩一句话: 一个工厂只创建一类具体产品(如上面所说,增加产品族时,需要增加工厂;增加新产品时,就修改工厂)

补充下: 产品族(就是不同产品登记结构中,功能相关的产品组成的家族–举个例子: 如我们的人类族系: 赵氏宗族,叶氏宗族,就是两个宗族,有初步了解了吧?再举个产品例子: 比如产品: 小米系列和华为系列)

优点:

  • 隔离具体类的生成,客户只要用即可,不需要知道什么被创建
  • 增加新的具体工厂以及产品族是很方便

缺点:

  • 对于增加新产品等级结构更加复杂,需要修改抽象工厂和所有的具体工厂类

完结

好了,每天都进步一点点

在这里插入图片描述

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

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

相关文章

在线开源免费问卷调查系统

在线开源免费问卷调查系统 平台简介 本项目旨在提供一个简单易用的问卷调查平台,帮助用户创建、分享问卷,并收集、分析调查数据。我们希望能够为各行各业的调查需求提供一种高效、便捷的解决方案。 项目特点 用户友好:清晰直观的用户界面…

QT6 libModbus 用于ModbusTcp客户端读写服务端

虽然在以前的文章中多次描述过,那么本文使用开源库libModbus,可得到更好的性能,也可移植到各种平台。 性能:读1次和写1次约各用时2ms。 分别创建了读和写各1个连接指针,用于读100个寄存器和写100个寄存器,读写分离。 客户端&am…

5、DVWA代码审计(2)

一、csrf 1、csrf(low) 限制 复现 GET /vulnerabilities/csrf/?password_new123456&password_conf123456&ChangeChange HTTP/1.1 Host: ddd.com Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,…

手撸AI-3: Accelerate库分布式训练详解

一. 引言 Accelerate 是 Hugging Face 公司开发的一个 Python 库,旨在简化并优化在各种环境中进行深度学习训练的过程,包括单机、多 GPU、TPU 和各种分布式训练环境。这个库提供了一种通用的 API,可以方便地将原来只能在单个设备上运行的代码…

chromedriver,Chrome驱动的实时更新

发现自己的selenium项目跑不起来了 效验驱动版本 下载链接(可能需要魔法) https://registry.npmmirror.com/binary.html?pathchromedriver/ https://googlechromelabs.github.io/chrome-for-testing/ 找到驱动位置 1. 默认安装路径:Chrome驱动通常会默认安装在系…

智能驾驶规划控制理论学习02-基于搜索的路径规划方法

目录 一、路径搜索问题 二、图论基础 三、图搜索方法 1、广度优先搜索(BFS) bfs与dfs的区别 bfs的搜索过程 bfs的算法实现 2、迪杰斯特拉算法(Dijkstra) 核心思想 优先级队列 Dijkstra搜索过程 Dijkstra优缺点…

微服务day03-Nacos配置管理与Nacos集群搭建

一.Nacos配置管理 Nacos不仅可以作为注册中心,可以进行配置管理 1.1 统一配置管理 统一配置管理可以实现配置的热更新(即不用重启当服务发生变更时也可以直接更新) dataId格式:服务名-环境名.yaml,分组一般使用默认…

【比较mybatis、lazy、sqltoy、mybatis-flex操作数据】操作批量新增、分页查询(二)

orm框架使用性能比较 环境: idea jdk17 spring boot 3.0.7 mysql 8.0比较mybatis、lazy、sqltoy、mybatis-flex操作数据 测试条件常规对象 orm 框架是否支持xml是否支持 Lambda对比版本mybatis☑️☑️3.5.4sqltoy☑️☑️5.2.98lazy✖️☑️1.2.4-JDK17-SNAPS…

2024最新算法:鹦鹉优化算法(Parrot optimizer,PO)求解23个基准函数(提供MATLAB代码)

一、鹦鹉优化算法 鹦鹉优化算法(Parrot optimizer,PO)由Junbo Lian等人于2024年提出的一种高效的元启发式算法,该算法从驯养的鹦鹉中观察到的觅食、停留、交流和对陌生人行为的恐惧中汲取灵感。这些行为被封装在四个不同的公式中…

leetcode:37.解数独

题目理解:本题中棋盘的每一个位置都要放一个数字(而N皇后是一行只放一个皇后),并检查数字是否合法,解数独的树形结构要比N皇后更宽更深。 代码实现:

2024免费mac苹果电脑的清理和维护软件CleanMyMac X

对于 Mac 用户来说,电脑的清理和维护是一件让人头疼的事情。但是,有了 CleanMyMac X,这一切都将变得轻松愉快。CleanMyMac X 是一款专为 Mac 设计的电脑清理软件,它以其强大的功能和简单的操作,让无数用户为之倾倒。 C…

数据结构开篇

目录 一. 如何学好数据结构二. 基本概念和术语2.1 区分数据、数据元素、数据项、数据对象2.2 数据结构2.2.1 逻辑结构2.2.2 存储结构 2.3 数据类型和抽象数据类型2.4 抽象数据类型的实现 \quad 一. 如何学好数据结构 勤于思考;多做练习;多上机;善于寻求帮助;不怕困难&#xff…

vue+element模仿实现云码自动验证码识别平台官网

一、项目介绍 项目使用传统vue项目结构实现,前端采用element实现。 element官网:Element - The worlds most popular Vue UI framework 云码官网地址:云码-自动验证码识别平台_验证码识别API接口_免费验证码软件 项目截图,支持…

浅析 explicit 关键字

浅析 explicit 关键字 文章目录 浅析 explicit 关键字前言案例剖析补充案例总结 前言 ​ C 提供了多种方式来实现类型转换和构造对象,然而,有时候这些方式会导致一些意想不到的结果,比如隐式转换和复制初始化。为了避免这些潜在的问题&#…

Redis安全加固策略:配置文件权限设置 配置本地日志存储目录 连接超时时间限制

Redis安全加固策略:配置文件权限设置 & 配置本地日志存储目录 & 连接超时时间限制 1.1 配置文件权限设置1.2 配置本地日志存储目录1.3 连接超时时间限制 💖The Begin💖点点关注,收藏不迷路💖 1.1 配置文件权限…

【双指针】合并两个有序数组O(N)

合并两个有序数组 链接 . - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/merge-sorted-array/ 题目 题解 采用双指针…

Java项目:31 基于SSM的勤工俭学管理系统

作者主页:源码空间codegym 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 勤工助学系统有管理员,部门管理员,用户三个角色。 管理员功能有个人中心。管理员管理,部门管理员管理&…

vs code更新后json文件无法识别通配符 ,编译多文件失败的解决办法

问题描述 在Mac或者LInux上,进行C/C相同路径下进行多文件编译时,之前设置好的json文件突然不能解释通配符,并且将带有单引号的地址传给clang,由于*.c被扩在单引号中,clang找不到文件导致失败。 如果将命令端中的指令复…

新一代电话机器人开源PHP源代码

使用easyswoole 框架开发的 新一代电话机器人开源PHP源码 项目地址:https://gitee.com/ddrjcode/robotphp 代理商页面演示地址 http://119.23.229.15:8080 用户名:c0508 密码:123456 包含 AI外呼管理,话术管理,CR…

Android java基础_异常

一.异常的概念 在Java中,异常(Exception)是指程序执行过程中可能出现的不正常情况或错误。它是一个事件,它会干扰程序的正常执行流程,并可能导致程序出现错误或崩溃。 异常在Java中是以对象的形式表示的,…