【设计模式】创建者模式之 工厂方法 抽象工厂

工厂方法模式(Factory Method)

一个特定功能,往往有多种实现方式,但是很难有某一个实现可以适用于所有情况,因此往往需要根据特定的场景选择不同的实现。试想:把选择具体实现的代码放在业务中会发生什么?每当我们需要一个新的功能拓展时,就要改动业务代码,但是这样违背了OCP,引入工厂方法模式可以解决这样的问题。

意图(Intent)

工厂方法模式:一种创建者模式,提供了一个创建类的接口,具体创建该类的哪种实现类,由传入的子类工厂决定

工厂方法模式其实就是对子类构造的封装。

工厂是对创建类的接口一种隐喻。我们把需求传递给工厂,工厂就能构造出一个相对应的子类

可以直接在工厂中加入产品的方法,这样就可以直接通过工厂使用产品方法,而不需要再调用产品

结构(Structure)

工厂方法模式的结构图如下:

在这里插入图片描述

  • CreatorProductProduct的工厂,它包含了一个构造Product的方法和Product内部的方法
  • ConcreProductAConcreProductBProduct的实现类,每个类都有一个对应的工厂子类
  • 工厂接口只负责定义工厂的行为,工厂的具体行为,由对应实现类的子类负责实现

为什么需要工厂方法模式?

工厂方法模式的必要性可以从多个维度解释,本文提供了其中两种解释:

  1. 首先我们要明确一个概念,客户端只通过接口使用产品,而不需要知道其中的细节,我们作为开发者也不想让客户端知道这些细节。工厂方法模式就可以理解为一种创建产品的接口,这个产品内部可能需要各种各样的属性,来实现产品的功能,客户端传入的数据怎么分配在该产品的属性中不是客户端需要知道的。

  2. 而从OCP的角度来看,如果没有工厂接口,每次新增加一个产品类,我们就要重新在客户端加入一段代码,实现该产品的创建,这个显然违背了OCP。

实现方式(implement)

  1. 为要实现的功能创建一个接口或者抽象类
  2. 为这个接口或抽象类创建一个工厂接口
  3. 用不同的子类实现这个接口或抽象类
  4. 为每个子类编写工厂接口的实现工厂类
  5. 在创建子类实例时,调用对应的工厂类的方法即可

优缺点(Pros & Cons)

  • 可以避免客户端和具体产品的高耦合

  • 保证SRP,选择并创建具体产品的工作交给工厂

  • 保证OCP,当有新的实现类的时候,只需要继承父类即可,不用改变客户端代码

  • 代码过于复杂,并且可能造成类爆炸

抽象工厂(Abstract Factory)

工厂方法模式为我们提供了每种产品的实现方法,解耦了客户端和具体产品的紧密关联,但是过于冗杂的类会让我们对项目管理的难度大大提升,为了解决这个问题,我们可以使用抽象工厂模式。

意图(Intent)

抽象工厂是对不同产品的抽象。就像我们可以通过学生的共有特性抽象出学生类一样,抽象工厂将具有某种相同特性的产品抽象到了一个类,这个类中有多个工厂方法。

工厂方法不是一个类!上文似乎把工厂方法作为一个类在讲解,这其实是为了简化工厂方法模式的讲解,而只在类中声明了工厂方法一个方法。

举个例子来讲,一套衣服包括了上衣和裤子。那么一个抽象工厂中就包含了两个工厂方法,一个用于生产上衣,一个用于生产裤子。

结构(Structure)

抽象工厂的结构图如下:

在这里插入图片描述

  • 抽象工厂负责建造两种产品:ProductAProductB
  • 定义一个抽象工厂的接口
  • 根据产品的不同风格实现抽象工厂接口

为什么需要抽象工厂模式?

抽象工厂模式是对工厂方法模式的一种拓展,一个抽象工厂类应该包含多种工厂方法,这样可以让类的管理更有逻辑性,也能对相似风格的不同产品进行抽象。

优缺点(Pros & Cons)

  • 具有工厂方法的优点

  • 可以保证来自同一工厂的不同产品是兼容的

  • 可以减少工厂方法带来的类爆炸

  • 使类的管理更清晰

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

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

相关文章

【C++】vector类的增删改查模拟实现(图例超详细解析!!!)

目录 一、前言 二、源码引入 三、vector的模拟实现 ✨实现框架 ✨前情提要 ✨Member functions —— 成员函数 ⚡构造函数 ⭐无参构造 ⭐迭代器区间构造 ⭐n个值构造 ⚡拷贝构造 ⚡运算符赋值重载 ⚡析构函数 ✨Element access —— 元素访问 ⚡operator[ ] …

一文全面了解 wxWidgets 布局器(Sizers)

目录 Sizers背后的理念 共同特征 最小大小 边框 对齐方式 伸缩因子 使用 Sizer 隐藏控件 wxBoxSizer wxStaticBoxSizer wxGridSizer wxFlexGridSizer 布局器(Sizers),由wxWidgets类层次结构中的wxSizer类及其派生类表示&#xff0…

电商核心技术揭秘四十五:营销与广告策略(下)

相关系列文章 电商技术揭秘相关系列文章合集(1) 电商技术揭秘相关系列文章合集(2) 电商技术揭秘相关系列文章合集(3) 电商技术揭秘四十一:电商平台的营销系统浅析 电商技术揭秘四十二&#…

苹果可能将OpenAI技术集成至iOS/iPadOS 18

🦉 AI新闻 🚀 苹果可能将OpenAI技术集成至iOS/iPadOS 18 摘要:苹果正在与OpenAI就将GPT技术部署在iOS/iPadOS 18中进行谈判。这项技术被视为可能增强的Siri功能,即“AI聊天机器人”。除Siri外,新技术还可能改善Spotl…

mac idea 下载spring 源码遇到的问题

一、Kotlin: warnings found and -Werror specified 这个问题网上看了很多文章多说是缺少cglib、objenesis包。然后执行了 实际还是没有什么用 解决: 最后自己看了一下前面一个警告。说的就是版本太低。所以我觉得是这个前置问题导致的 然后搜索了改这个Kotlin版本…

在Mac上恢复已删除文件夹的最佳方法

“嗨,我从我的Mac Documents文件夹中删除了很多文件夹。已删除的文件夹包含我的重要文档和文件,是否可以取回它们?垃圾桶已被清洁软件清空。如何在我的Mac上恢复已删除的文件夹? 当您在 Mac 上删除 1 或 2 个文件夹时&#xff0c…

免费开源语音克隆-GPT-SoVITS-WebUI只需 5 秒的声音样本

语音克隆-GPT-SoVITS-WebUI 强大的少样本语音转换与语音合成Web用户界面。 功能: 零样本文本到语音(TTS): 输入 5 秒的声音样本,即刻体验文本到语音转换。 少样本 TTS: 仅需 1 分钟的训练数据即可微调模型…

抖音小店运营实战班,全新升级 从零到进阶精通 分享月销百万小店核心秘密

课程内容: 1 2024抖音电商发展趋势及抖店运营策略(直播2024 0412).mp4 2 1-1抖音小店入驻流程(直播2024 04 12),mp4 3 1-2个体店铺VS企业店铺有什么区别(直播20240412).mp4 4 1-3抖音小店店铺搭建(直播2024 04 12).mp4 5 2-1-如何避免违禁词(附违禁词大全)(直播…

设计模式之模板模式

模板模式(Template Method Pattern)是行为设计模式之一,它定义了一个操作中的算法骨架,而将一些步骤延迟到子类中实现。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤,从而达到复用算法框架…

每日一题(力扣213):打家劫舍2--dp+分治

与打家劫舍1不同的是它最后一个和第一个会相邻,事实上,从结果思考,最后只会有三种:1 第一家不被抢 最后一家被抢 2 第一家被抢 最后一家不被抢 3 第一和最后一家都不被抢 。那么,根据打家劫舍1中的算法 我们能算出在i…

蓝桥杯练习系统(算法训练)ALGO-951 预备爷的悲剧

资源限制 内存限制:512.0MB C/C时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 问题描述 英语预备爷gzp是个逗(tu)比(hao),为了在即将到来的英语的quiz中不挂科,gzp废寝忘食复习英语附录单词…

PAT (Advanced Level) - 1006 Sign In and Sign Out

模拟 #include <iostream> #include <cstring> #include <algorithm> using namespace std;int m; string open_id, open_time; string close_id, close_time;int main(){cin >> m;for (int i 0; i < m; i ) {string id, in_time, out_time;cin …

深度学习:基于Keras,使用长短期记忆人工神经网络模型(LSTM)对股票市场进行预测分析

前言 系列专栏&#xff1a;机器学习&#xff1a;高级应用与实践【项目实战100】【2024】✨︎ 在本专栏中不仅包含一些适合初学者的最新机器学习项目&#xff0c;每个项目都处理一组不同的问题&#xff0c;包括监督和无监督学习、分类、回归和聚类&#xff0c;而且涉及创建深度学…

Unity开发一个FPS游戏之四

在前面的系列中&#xff0c;我已介绍了如何实现一个基本的FPS游戏&#xff0c;这里将继续进行完善&#xff0c;主要是增加更换武器以及更多动作动画的功能。 之前我是采用了网上一个免费的3D模型来构建角色&#xff0c;这个模型自带了一把AR自动步枪&#xff0c;并且自带了一些…

链表经典面试题上

目录 创作不易&#xff0c;如若对您有帮助&#xff0c;还望三连&#xff0c;谢谢&#xff01;&#xff01;&#xff01; 题目一&#xff1a;203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; 题目二&#xff1a;206. 反转链表 - 力扣&#xff08;LeetCode&#xff…

电脑如何查看一段时间内是否被人使用过?

前言 有时候我们可能会担心别人未经许可使用我们的电脑。为了确保自己不在场时电脑是否被使用过&#xff0c;以下两种方法可能会帮到你 第一种方法 WinX打开事件查看器。像WinX能快速打开很多东西&#xff0c;比如安装的应用(可以进行软件的删除)&#xff0c;设备管理器&…

网络性能测试工具iperf3 和iperf

目录 1. iperf工具介绍 2. 下载安装 3. 使用方法 1. iperf工具介绍 iperf 是一个网络性能测试工具&#xff0c;用于测量网络带宽和性能。它可以在客户端和服务器之间进行数据传输&#xff0c;并提供了丰富的选项来配置测试参数和输出格式。 iperf 和 iperf3 都是用于测量网…

什么是发售?

什么是发售? 很多人不知道什么是发售,因为这个词刚被广而告之,在这里普及一下什么是发售? 发售,它是通过一套流程,把你的产品疯狂大卖的一种技术。通常有三个步骤,就是造势、预售、发售。那么这三个词怎么理解呢? 第一步:造势 造势的核心是引发关注,但是不做销售…

【机器视觉】Segment Anything模型(SAM) C# 推理

Facebook开源的Segment Anything是一个基于大型预训练模型的计算机视觉工具&#xff0c;它使用一种新的范式来处理图像分割任务。这个范式不依赖于传统的预训练加微调&#xff08;pretrainfinetune&#xff09;方法&#xff0c;而是通过提示&#xff08;prompt&#xff09;加上…

关于我转生从零开始学C++这件事:升级Lv.10

❀❀❀ 文章由不准备秃的大伟原创 ❀❀❀ ♪♪♪ 若有转载&#xff0c;请联系博主哦~ ♪♪♪ ❤❤❤ 致力学好编程的宝藏博主&#xff0c;代码兴国&#xff01;❤❤❤ 盘古开天辟地&#xff0c;大伟五一更新。大家好哇&#xff0c;大伟今天继续给大家来更新我们的C&#xff1a;…
最新文章