当前位置: 首页 > news >正文

【设计模式】简单工厂模式

❓首先什么是设计模式?

😵相信刚上大学的你和我一样,在学习这门课的时候根本不了解这些设计原则和模式有什么用处,反而不如隔壁的C++更有意思,至少还能弹出一个小黑框,给我个hello world。

✨ 如何你和我一样也是这么想,那接下来咱们以贴合生活实际的方式来看看设计模式到底有什么神奇的地方

😄更多有趣的设计模式讲解都在设计模式👍专栏,欢迎来看看🎉🎉🎉。

【设计模式】工厂模式

  • 前言
  • 简单工厂模式
  • 优势
  • 问题
  • 总结

前言

接下来咱们就开始讲解各种设计模式了。不同于之前我们聊的六大原则,这些设计模式直接给我们了模板,在实际应用的时候可以直接套用这些模板

但是在了解的过程中你会发现,可能有些设计模式增加代码量,可是我们的目的不是为了提升开发效率吗?

这里先给出答案,我们所谓的提升开发效率并不会体现到最初的架构设计中,相反,使用设计模式会使得我们的开发时间增加

但是,如果后期我们需要更新或则添加新功能的时候,设计模式的优势就体现出来了,那具体是怎么提升效率的,我们一起来看看吧。

简单工厂模式

我们先不讲什么是简单工厂模式,我们先从实际业务聊一聊,看看为什么会出现简单工厂模式

首先先从生活角度讲起哈,给定一个场景,如下

我们开了一家汽车店,这家汽车店一方面需要组装汽车,另一方面需要卖汽车。我们的工作流程就是

组装汽车 ==》卖汽车

随着订单数量的上升,我们在组装汽车的时候还要考虑怎么去讨好消费者,从而卖掉汽车

这无疑让我们有了许多的烦恼,但是后来我突然发现,既然我一个人干起来太费劲了,我可不可以找另一个人帮我分担些工作呢

于是,我就想到了是不是可以组装汽车这个工作外包给其他人,那我就不需要考虑造汽车的过程了,我只需要找外包工厂要汽车,然后想方设法讨好消费者就好了。这样确实可以帮助我们省去了造车的烦恼。

但上述的过程如果应用到代码实现有什么好处吗?或者换句话说,简单工厂模式的意义在哪?

我们用伪代码来看一下

没有工厂模式的时候

 public void all() {System.out.println("复杂的造车过程");System.out.println("想办法卖掉这辆车");}

all就是造车和卖车的整个过程。可以看到我们的方法里的功能太过冗余了,既要造车又要卖车,这和咱们之前提到的单一原则完全不吻合。

另外我们如果需要修改造车的具体实现,我们需要十分小心,因为我们的修改可能会影响到卖车的流程。 用咱们的话来说,这是啥,就是二者的耦合度太高了

那使用工厂模式之后呢

汽车工厂

public class CarFactory {//  工厂类返回生产好的汽车对象public Car getBYD() {System.out.println("复杂的制造过程");return new BYD();}
}
    public void sellCar() {CarFactory carFactory = new CarFactory();Car car = carFactory.getBYD();System.out.println("想办法卖掉这辆车");}

此时你就会发现,我们的sellcar里并不需要考虑如何造车,只需要调用工厂类的方法就可获取到车,然后专心卖车就好了。即使以后造车过程有变动,我们也是直接修改CarFactory,并不需要修改sellcar这个方法。

优势

看完上面的流程,相信我们大概清楚了简单工厂模式是什么,接下来我们总结一下他的优势。

降低耦合度

这个还是比较好理解的,如上文所述,我们把造车和卖车分开了,造车使用工厂模式。这个好处就是我们售卖方法并不需要知道造车的具体流程,这样就不至于出现我们修改售卖流程,不小心把造车过程也给修改了的问题

封装创建对象的细节

我们直接把造车的过程封装到了工厂类中,这样以后的开发人员并不需要知道造车的细节,直接使用即可。 可以帮助之后的工作人员快速上手。

问题

如上所述,我们已经大体了解了简单工厂模式,但现在有一个问题,我们现在联系的造车厂只能生产A车,但我们现在扩大规模了,想让工厂也生产B车。

但是工厂告诉我们,如果要生产B车,需要重建整个生产线,这样才能提供B车。

那就很麻烦了,这怎么解决呢?

我们找一个单独的工厂他很难提供给我们多种类型的车,但如果我们找一个集团呢

这个集团下面有各种各样工厂,可以帮助我们生产各式各样的车,别说A、B车了,CDEF都行,那我们要怎么去找这个集团呢?

这些内容就是后面我们要讲的抽象工厂的内容了!

总结

先写到这里,抽象工厂模式很快更新!
在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Ai+若依(页面调整--去除若依的各种痕迹,采用自己的):【07篇】
  • Qt_信号槽机制
  • UnrealEngine学习(01):安装虚幻引擎
  • 教育与经济
  • Linux(CentOS8)系统安装mysql-8.0.26-linux-glibc2.12-x86_64.tar.xz
  • 制造业中的MES知识与ERP\PLM\WMS架构关系(附智能制造MES解决方案PPT下载)
  • 极限基础:变化率在manim中的实现
  • 【数据科学概述】数据科学的基本概念与发展历程】
  • 2408gui,学习gui的经验
  • 超详细Git基本命令使用(二)
  • UNI-APP 打包构建 APK
  • 微信小程序代码目录结构介绍
  • 数据结构概念
  • ‌分布式计算技术与复杂算法优化:‌现代数据处理的基石
  • Java 应用的熔断机制:服务降级与恢复
  • 自己简单写的 事件订阅机制
  • 2018一半小结一波
  • Babel配置的不完全指南
  • Django 博客开发教程 16 - 统计文章阅读量
  • ES6语法详解(一)
  • Java到底能干嘛?
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • npx命令介绍
  • python 装饰器(一)
  • python3 使用 asyncio 代替线程
  • Ruby 2.x 源代码分析:扩展 概述
  • 构建工具 - 收藏集 - 掘金
  • 深入浅出webpack学习(1)--核心概念
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 用Python写一份独特的元宵节祝福
  • FaaS 的简单实践
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • ​Java基础复习笔记 第16章:网络编程
  • ‌分布式计算技术与复杂算法优化:‌现代数据处理的基石
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • $$$$GB2312-80区位编码表$$$$
  • (1)bark-ml
  • (35)远程识别(又称无人机识别)(二)
  • (BAT向)Java岗常问高频面试汇总:MyBatis 微服务 Spring 分布式 MySQL等(1)
  • (windows2012共享文件夹和防火墙设置
  • (ZT)一个美国文科博士的YardLife
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (二)JAVA使用POI操作excel
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (十六)一篇文章学会Java的常用API
  • (十一)图像的罗伯特梯度锐化
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (一)十分简易快速 自己训练样本 opencv级联haar分类器 车牌识别
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (已解决)什么是vue导航守卫
  • (转)3D模板阴影原理
  • (转)linux下的时间函数使用
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .net core + vue 搭建前后端分离的框架
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式