面试笔记——工厂模式(简单工厂、工厂方法模式、抽象工厂模式)

场景需求:设计一个咖啡店点餐系统。 设计一个咖啡类(Coffee),并定义其两个子类(美式咖啡【AmericanCoffee】和拿铁咖啡【LatteCoffee】);再设计一个咖啡店类(CoffeeStore),咖啡店具有点咖啡的功能。

在不使用工厂模式情况下,类设计如下:
在这里插入图片描述
以上类图中的符号表示:

  • +:表示public
  • -:表示private
  • #:表示protected
  • 泛化关系(继承) 用带空心三角箭头的实线来表示
  • 实现关系 用带空心的三角箭头的虚线来表示
  • 依赖关系 使用带箭头的虚线来表示
  • 类图的分成三部分:第一部分——类的名称;第二部分——类的属性;第三部分——类的方法,方法的“:”后面表示方法的返回值类型

简单工厂模式

简单工厂包含如下角色:

  • 抽象产品 :定义了产品的规范,描述了产品的主要特性和功能。
  • 具体产品 :实现或者继承抽象产品的子类,每种具体产品都有自己的特点。
  • 具体工厂 :提供了创建产品的方法,调用者通过该方法来获取产品。

简单工厂模式下的类实现:
在这里插入图片描述
CoffeeStore不再关注创建咖啡的类型,创建咖啡的具体实现交给SimpleCoffeeFactory。

简单工厂模式的主要优点

  1. 封装性:客户端代码不需要知道创建对象的具体类,只需要知道相应的参数即可,这降低了客户端代码与具体实现之间的耦合度。

  2. 集中管理:所有的对象创建逻辑都集中在工厂类中,便于管理和维护。

  3. 易于扩展:当需要添加新的产品类型时,只需要在工厂类中添加新的逻辑,而不需要修改客户端代码。

简单工厂模式的缺点

  1. 违反开闭原则:当添加新的产品类型时,需要修改工厂类,这违反了开闭原则(软件工程原则之一,即软件实体应当是可扩展,而不可修改的)。

  2. 工厂类职责过重:随着产品类型的增多,工厂类的职责可能会变得过于繁重,这可能导致代码的可读性和可维护性下降。

  3. 类型安全问题:由于工厂方法通常使用字符串参数来确定要创建的对象类型,这可能导致类型安全问题,比如传入无效的参数。

工厂方法模式

工厂方法模式的主要角色:

  • 抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法来创建产品。
  • 具体工厂(Concrete Factory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
  • 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。
  • 具体产品(Concrete Product):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。

工厂方法模式下类的具体设计:
在这里插入图片描述
Coffee类是抽象产品角色;AmericanCoffee和LatteCoffee类是具体产品角色;CoffeeFactory是抽象工厂角色,定义了创建产品的规范;AmericanCoffeeFactory和LatteCoffeeFactory是具体工厂角色。

此设计模式下的调用关系:
在这里插入图片描述
为了便于理解,CoffeeStore的代码如下:

public class CoffeeStore {public static void main(String[] args) {//可以根据不同的工厂,创建不同的产品CoffeeStore coffeeStore = new CoffeeStore(new LatteCoffeeFactory());Coffee latte = coffeeStore.orderCoffee();System.out.println(latte.getName());}private CoffeeFactory coffeeFactory;public CoffeeStore(CoffeeFactory coffeeFactory){this.coffeeFactory = coffeeFactory;}public Coffee orderCoffee(){Coffee coffee = coffeeFactory.createCoffee();//添加配料coffee.addMilk();coffee.addSuqar();return coffee;}
}

如上面的代码所示,用户只需要根据需求,创建一个具体工厂对象就可以了。

工厂方法模式的优点

  1. 解耦:用户只需要知道具体工厂的名称就可以得到所要的产品,无需知道产品的具体创建过程。
  2. 扩展性:当系统需要引入新的产品时,只需要添加新的具体产品类和对应的具体工厂类,无需修改原有的工厂类,这符合开闭原则
  3. 灵活性:工厂方法模式提供了一种灵活的方式来创建对象,解除了客户端与具体产品的依赖关系,增加了代码的可扩展性和可维护性。

工厂方法模式的缺点

  1. 增加系统复杂度:每增加一个产品,就需要增加一个具体产品类和对应的具体工厂类,这增加了系统的复杂度、开发量和维护成本。。
  2. 运行效率低:每次创建具体产品类的实例时,都需要通过具体工厂类来创建,这可能会影响系统的运行效率。

抽象工厂模式

抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。
一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。

关于产品和等级的理解:
在这里插入图片描述
产品族:一个品牌下面的所有产品;例如华为下面的电脑、手机称为华为的产品族;
产品等级:多个品牌下面的同种产品;例如华为和小米都有手机电脑为一个产品等级;

工厂方法模式只考虑生产同等级的产品,抽象工厂可以处理多等级产品的生产。

使用场景:现咖啡店业务发生改变,不仅要生产咖啡还要生产甜点

  • 同一个产品等级(产品分类)
    • 咖啡:拿铁咖啡、美式咖啡
    • 甜点:提拉米苏、抹茶慕斯
  • 同一个风味,就是同一个产品族(相当于同一个品牌)
    • 美式风味:美式咖啡、抹茶慕斯
    • 意大利风味:拿铁咖啡、提拉米苏

类的具体实现:
在这里插入图片描述
产品工厂就是超级工厂角色。
此时的调用关系为:
在这里插入图片描述
抽象工厂模式的优点

  1. 客户端无需知道它所需要的对象的类,只需要知道相应的工厂即可,这降低了客户端与具体实现之间的耦合度。
  2. 可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。
  3. 当需要引入新的产品族时,只需要添加新的工厂类和对应的具体产品类,而无需修改已有的代码,这符合开闭原则。
  4. 当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

抽象工厂模式的缺点

  1. 产品族扩展困难,需要修改工厂类的代码来支持新的产品族。

综上:

  • 简单工厂(并不算是设计模式)
    • 所有的产品都共有一个工厂,如果新增产品,则需要修改代码,违反开闭原则
    • 是一种编程习惯,可以借鉴这种编程思路
  • 工厂方法模式
    • 给每个产品都提供了一个工厂,让工厂专门负责对应的产品的生产,遵循开闭原则
    • 项目中用的最多
  • 抽象工厂方法模式
    • 如果有多个纬度的产品需要配合生产时,优先建议采用抽象工厂(工厂的工厂)
    • 一般的企业开发中的较少

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

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

相关文章

深度学习之基于YOLOv5草莓成熟度目标检测系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 草莓作为一种广受欢迎的水果,其成熟度的判断对于保证草莓的品质和口感至关重要。然…

python直接发布到网站wordpress之三批量发布图片

在前面的文章中,实现了使用python操作wordpress发布文字内容和图片内容。 python直接发布到网站wordpress之一只发布文字-CSDN博客 python直接发布到网站wordpress之二发布图片-CSDN博客 不过,此时发布图片的数量只能是一张图片。但在实际应用中&…

VINS预积分与误差模型

文章目录 IMU的测量值误差模型IMU预积分真实模型IMU预积分估计模型误差模型普通增量积分中值积分法 参考文献 IMU的测量值误差模型 IMU的测量值误差模型: a ^ t a t R w t g w b a t n a t ω ^ t ω t b ω t n ω t \begin{array}{} {{{\hat a}_t} {a_t…

10页面结构分析

我们打开一个网页&#xff0c;都会有一个清晰的结构和布局上图中的标签就是用来划分各个部分区域用的。其中比较常用重要的是header、footer和nav&#xff0c;需要重点掌握。 下面是部分代码及效果演示 <header> <h2>网页头部</h2> </header><sec…

C++实现二叉搜索树(模型)

目录 1.二叉搜索树的概念 2.二叉搜索树的实现 2.1总体代码预览 2.2各个函数实现原理 链表结构体 二叉搜索树的成员变量 二叉搜索树的插入 二叉搜索树的查找 二叉搜索树的遍历 二叉搜索树的删除 1.二叉搜索树的概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#…

AI去衣技术在动画制作中的应用

随着科技的发展&#xff0c;人工智能&#xff08;AI&#xff09;已经在各个领域中发挥了重要作用&#xff0c;其中包括动画制作。在动画制作中&#xff0c;AI去衣技术是一个重要的工具&#xff0c;它可以帮助动画师们更加高效地完成工作。 AI去衣技术是一种基于人工智能的图像…

jenkins目录下的vue3项目——pnpm install后运行报错——奇葩问题解决

昨天到今天&#xff0c;同事那边遇到一个问题&#xff0c;就是关于vue3vite的项目&#xff0c;在执行了自动打包后&#xff0c;运行代码会提示报错的问题。 报错信息如下&#xff1a; 具体错误信息如下&#xff1a; ERROR 11:28:14 [vite] Pre-transform error: Cannot find …

C语言实战项目---通讯录

项目要实现的内容&#xff1a;能够存放100个人的通讯录程序&#xff0c;能够实现联系人数据的存储&#xff0c;删除&#xff0c;修改&#xff0c;查找&#xff0c;展示联系人的信息。 所需知识&#xff1a;结构体&#xff0c;指针&#xff0c;函数................. 废话不多…

AI绘画成果展(第一期)

免费获取更多原图&#xff0c;备注“AI绘画”&#xff0c;可在文章末尾点击名片进qun获取。 免费获取更多原图&#xff0c;备注“AI绘画”&#xff0c;可在文章末尾点击名片进qun获取。

pandas索引

pandas索引 一、索引1.1 建立索引1.2 重置索引1.3 索引类型1.4 索引的属性1.5 索引的操作 一、索引 1.1 建立索引 建立索引可以在数据读取加载中指定索引&#xff1a; import pandas as pd df pd.read_excel(team.xlsx, index_colname) # 将name列设置为索引 df.head()效…

Hadoop3:HDFS的架构组成

一、官方文档 我这里学习的是Hadoop3.1.3版本&#xff0c;所以&#xff0c;查看的也是3.1.3版本的文档 Architecture模块最下面 二、HDFS架构介绍 HDFS架构的主要组成部分&#xff0c;是一下四个部分 1、NameNode(NN) 就是Master节点&#xff0c;它是集群管理者。 1、管…

解决 SyntaxError: Unexpected token ‘.‘ 报错问题

这个报错一般是编译问题&#xff0c;浏览器的版本过低没通过代码 解决办法&#xff1a; 在package.json文件中加上这个 "browserslist": ["> 1%","last 2 versions","not dead","not ie < 6","Android > 4&…

Web 3.0时代:软文发稿对企业品牌的影响

Web 3.0的到来&#xff0c;标志着我们已经进入了一个全新的互联网时代。在这个新时代中&#xff0c;信息的生成和传播有了更多的可能性和更广的空间。作为企业品牌宣传的重要手段之一的软文发稿&#xff0c;在Web 3.0时代将会面临什么样的挑战和机遇&#xff1f; 首先&#xf…

人脸美型SDK解决方案,适用于各类应用场景

视频内容已经成为企业宣传、产品展示、互动直播等多个领域的核心载体。而在这些场景中&#xff0c;高质量的人脸美型效果不仅能够提升用户体验&#xff0c;更能为品牌加分。美摄科技凭借深厚的技术积累和行业洞察&#xff0c;推出了全新的人脸美型SDK解决方案&#xff0c;为企业…

Fizzler库+C#:从微博抓取热点的最简单方法

概述 在这篇技术文章中&#xff0c;我们将深入研究如何利用Fizzler库结合C#语言&#xff0c;以实现从微博平台抓取热点信息的功能。微博作为中国乃至全球范围内具有重要影响力的社交媒体平台之一&#xff0c;在互联网信息传播中扮演着举足轻重的角色。通过Fizzler这一强大的.N…

Sarcasm detection论文解析 |CAT-BiGRU

论文地址 论文地址&#xff1a;CAT-BiGRU: Convolution and Attention with Bi-Directional Gated Recurrent Unit for Self-Deprecating Sarcasm Detection | Cognitive Computation github:Ashraf-Kamal/Self-Deprecating-Sarcasm-Detection (github.com) 论文首页 笔记框架 …

什么软件能在桌面提醒我 电脑桌面提醒软件

在这个信息爆炸的时代&#xff0c;我们每个人每天都需要处理海量的信息和任务。有时候&#xff0c;即便是再细心的人&#xff0c;也难免会因为事情太多而忘记一些重要的细节。 我就经常遇到这样的问题&#xff0c;明明记得自己有个重要的会议要参加&#xff0c;或者有个关键的…

LeetCode 每日一题 Day 144-157

2385. 感染二叉树需要的总时间 给你一棵二叉树的根节点 root &#xff0c;二叉树中节点的值 互不相同 。另给你一个整数 start 。在第 0 分钟&#xff0c;感染 将会从值为 start 的节点开始爆发。 每分钟&#xff0c;如果节点满足以下全部条件&#xff0c;就会被感染&#xf…

风电厂数字孪生3D数据可视化交互展示构筑智慧化电厂管理体系

随着智慧电厂成为未来电力企业发展的必然趋势&#xff0c;深圳华锐视点紧跟时代步伐&#xff0c;引领技术革新&#xff0c;推出了能源3D可视化智慧管理系统。该系统以企业现有的数字化、信息化建设为基础&#xff0c;融合云平台、大数据、物联网、移动互联、机器人、VR虚拟现实…

什么是视频号小店?为什么这么多人都在做?一文带你轻松入门!

大家好&#xff0c;我是电商花花。 现在电商的快速发展&#xff0c;电商行业在各大电商平台上不断发展&#xff0c;而视频号小店也被更多人看到和入驻&#xff0c;让更多创业者对视频号小店产生兴趣。 知道的人都觉得视频号小店是一个不可多得的创业项目&#xff0c;因为这里…