我终于读懂了工厂模式。。。

简介: 我终于读懂了工厂模式。。。

🍟简单工厂模式


看一个具体的需求


看一个披萨的项目:要便于披萨种类的扩展,要便于维护

1)披萨的种类很多(比如 GreekPizz、CheesePizz 等)

2)披萨的制作有 prepare,bake, cut, box 3)完成披萨店订购功能。

使用传统的方式来完

2a0fa3568f934e20ad979c0d78a892ae.png


准备一个抽象类


2a0fa3568f934e20ad979c0d78a892ae.png

准备三个子类


73245eca889140ce8eecc2f20a926001.png


一个订单服务器


05edc0d3214042279eedacfdde173a65.png


一个客户端


22b17651aec44355a10ef79160d7ad9e.png

传统的方式的优缺点


优点是比较好理解,简单易操作。


缺点是违反了设计模式的 ocp 原则,即对扩展开放,对修改关闭。即当我们给类增加新功能的时候,尽量不修改代码,或者尽可能少修改代码.


比如我们这时要新增加一个 Pizza 的种类(Pepper 披萨),我们需要做如下修改.如果我们增加一个 Pizza 类,只要是订购 Pizza 的代码都需要修改


4680973dc8194c3c9a1180f9851cf29f.png


4)改进的思路分析


分析:修改代码可以接受,但是如果我们在其它的地方也有创建 Pizza 的代码,就意味着,也需要修改,而创建 Pizza的代码,往往有多处。

思路:把创建 Pizza 对象封装到一个类中,这样我们有新的 Pizza 种类时,只需要修改该类就可,其它有创建到 Pizza对象的代码就不需要修改了.-> 简单工厂模式


基本介绍


1)简单工厂模式是属于创建型模式,是工厂模式的一种。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,工厂模式分为简单工厂模式及工厂方法模式


2)简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码)

3)在软件开发中,当我们会用到大量的创建某种、某类或者某批对象时,就会使用到工厂模式.


uml图

c7940e1d3466444f973bed18bb4d4273.png



简单方法工厂相比于正常的写法就多了个工厂类

5e32d3b9cbd148fcb88ef19d36fefa01.png


并且将创建披萨的任务交给工厂类来创建,并且在订单服务器类中调用工厂类方法就可以获得披萨

cc4920fa412745d086fd923a02f8bf7f.png


🍖工厂方法模式

看一个新的需求


披萨项目新的需求:客户在点披萨时,可以点不同口味的披萨,比如 北京的奶酪 pizza、北京的胡椒 pizza 或者是伦敦的奶酪 pizza、伦敦的胡椒 pizza。


思路 1


使用简单工厂模式,创建不同的简单工厂类,比如 BJPizzaSimpleFactory、LDPizzaSimpleFactory 等等.从当前这个案例来说,也是可以的,但是考虑到项目的规模,以及软件的可维护性、可扩展性并不是特别好


思路 2


使用工厂方法模式


工厂方法模式介绍


1)工厂方法模式设计方案:将披萨项目的实例化功能抽象成抽象方法,在不同的口味点餐子类中具体实现。


2)工厂方法模式:定义了一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类。


工厂方法模式应用案例


披萨项目新的需求:客户在点披萨时,可以点不同口味的披萨,比如 北京的奶酪 pizza、北京的胡椒 pizza 或者是伦敦的奶酪 pizza、伦敦的胡椒 pizza


image.png



我们依据上面的图来创建主类


61de7bdf5b2e4c828861431f9f945063.png



输入bj之后我们跟着断点来进行下去


2991e16a083d49b29019141fb922ab84.png


发现它并没有进入到BJOrderPizza这个类中去,而是进入到了父类的构造方法里面去了


image.png


然后进入到createPizza方法中,由于该方法是抽象方法,所以又跳转到BJOrderPizza这个类中去



image.png


进而拿到了我们的披萨


image.png


这就是我们的工厂方法模式,它和简单工厂模式统一称为工厂模式,但是还有一个抽象工厂模式,在这里我们一起讲了


🍝抽象工厂模式


基本介绍


1)抽象工厂模式:定义了一个 interface 用于创建相关或有依赖关系的对象簇,而无需指明具体的类

2)抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合。

3)从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象)。

4)将工厂抽象成两层,AbsFactory(抽象工厂) 和 具体实现的工厂子类。程序员可以根据创建对象类型使用对应的工厂子类。这样将单个的简单工厂类变成了工厂簇,更利于代码的维护和扩展。

5)类图


7e8408ee31a743e491caa47e1f1ec6d8.png



可以看到这个相比于工厂方法模式的类图多了个AbsFactory类

我们debug一步一步跟着代码走



d8e7f9530a5e46e5aa4176088d9252db.png

可以看到这里通过构造器的方式将LDFactory类注入了进来


06bdc1926a9f4f8583b00b57133e3cfa.png

这里就会进入具体的实现类里面去创建披萨

4d2cbbf6c84a4a288f99c444203b8220.png


他其实就是将简单工厂模式和工厂方法模式进行整合。将工厂类给抽象出来。


实际上我们我们怎么使用呢?


如果你的项目需要使用很多不同类型的类,则推荐我们的抽象工厂模式


工厂模式在 JDK-Calendar 应用的源码分析


JDK 中的 Calendar 类中,就使用了简单工厂模式



087c2f2ea31f457ba5e78e29495b9b9f.png


874092d6738e4f379d4040bc0f49d0d8.png

工厂模式小结


1)工厂模式的意义将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦。从而提高项目的扩展和维护性。

2)三种工厂模式 (简单工厂模式、工厂方法模式、抽象工厂模式)

3)设计模式的依赖抽象原则


创建对象实例时,不要直接 new 类, 而是把这个 new 类的动作放在一个工厂的方法中,并返回。有的书上说,变量不要直接持有具体类的引用。

不要让类继承具体类,而是继承抽象类或者是实现 interface(接口) 不要覆盖基类中已经实现的方法。

资料参考:https://www.bilibili.com/video/BV1G4411c7N4


仓库地址:https://gitee.com/WangFuGui-Ma/design-pattern/tree/master/design/factory

相关文章
|
6月前
|
存储 缓存 资源调度
# Qwen3-8B 的 TTFT 性能分析:16K 与 32K 输入 Prompt 的推算公式与底层原理详解
Qwen3-8B 是通义实验室推出的 80 亿参数大模型,支持最长 32,768 token 上下文,适用于长文本处理场景。通过 FP8 量化、CUDA Kernel 优化及 RoPE 位置编码技术,提升推理效率与稳定性。模型在 16K 输入下 TTFT 约 150-200ms,32K 输入下约 250-300ms,适用于文档摘要与长对话交互。
1832 8
|
存储 人工智能 调度
容器服务:智算时代云原生操作系统及月之暗面Kimi、深势科技实践分享
容器技术已经发展成为云计算操作系统的关键组成部分,向下高效调度多样化异构算力,向上提供统一编程接口,支持多样化工作负载。阿里云容器服务在2024年巴黎奥运会中提供了稳定高效的云上支持,实现了子弹时间特效等创新应用。此外,容器技术还带来了弹性、普惠的计算能力升级,如每分钟创建1万Pod和秒级CPU资源热变配,以及针对大数据与AI应用的弹性临时盘和跨可用区云盘等高性能存储解决方案。智能运维方面,推出了即时弹性节点池、智能应用弹性策略和可信赖集群托管运维等功能,进一步简化了集群管理和优化了资源利用率。
|
安全 Java 数据库
Spring Boot 3 + JWT + Security 联手打造安全帝国:一篇文章让你掌握未来!
`Spring Security`已经成为`java`后台权限校验的第一选择.今天就通过读代码的方式带大家深入了解一下Security,本文主要是基于开源项目[spring-boot-3-jwt-security](https://github.com/ali-bouali/spring-boot-3-jwt-security)来讲解Spring Security + JWT(Json Web Token).实现用户鉴权,以及权限校验. 所有代码基于`jdk17+`构建.现在让我们开始吧!
3849 1
 Spring Boot 3 + JWT + Security 联手打造安全帝国:一篇文章让你掌握未来!
|
NoSQL Java Redis
蓝易云 - redisson参数配置
以上是Redisson的一些基本参数配置,具体的配置可能会根据你的应用需求有所不同。在配置Redisson时,你应该根据你的应用的特性和需求来选择合适的参数。
501 0
|
Shell 开发工具 git
如何使用git上传代码github仓库
如何使用git上传代码github仓库
|
Python
conda升级python版本
conda升级python版本
2163 0
|
存储 Web App开发 数据采集
|
机器学习/深度学习 人工智能 监控
【AI 现况分析】AI 大模型在自动化交易的应用
【1月更文挑战第27天】【AI 现况分析】AI 大模型在自动化交易的应用
|
测试技术 开发工具 git
Git 命令行教程:如何在 GitLab 中恢复已删除的分支
在软件开发过程中,版本控制是一个至关重要的环节。Git 是最流行的分布式版本控制系统之一,它能够帮助团队高效地管理代码。然而,有时候会发生意外,例如代码误合、错误的删除等情况,导致重要的开发分支本地和远程不慎被删除。本文将为您介绍如何使用 Git 命令行在 GitLab 中恢复已删除的分支,帮助您快速解决这类问题。
1409 0
Git 命令行教程:如何在 GitLab 中恢复已删除的分支
|
IDE Java 开发工具
Debug断点调试技巧,学会真的香!!
Debug断点调试技巧,学会真的香!!
454 0