Java设计模式之工厂模式

news2025/1/17 5:55:10

什么是工厂模式

工厂模式就是将创建对象的具体过程和使用过程分开,这样能够使代码更加灵活。

工厂模式主要分为三类:

  • 简单工厂模式
  • 工厂方法模式
  • 抽象工厂模式

比如在没有工厂的时候,用户需要一台奥迪车,那么就需要用户去创建一台奥迪车,然后使用

简单工厂模式:如果我需要一辆奥迪,我不需要自己去创建奥迪,想要奥迪哪个牌子直接通过工厂创建就行了,比如我需要奥迪A4L,那工厂就去创建奥迪A4L。

工厂方法模式:为了照顾不同的客户,奥迪车型越来越多,比如A4L、A6L、A8L等等,一个工厂无法创建所有的奥迪车型,于是单独出来多个具体的奥迪工厂,每个工厂创建一款车型,也就是具体的工厂类只能创建一个具体的产品。但是奥迪工厂还是个抽象,你需要指定某个具体的工厂才能生产出具体的奥迪车型。

抽象工厂模式:随着奥迪客户的要求越来越高,奥迪车必须配置LED显示屏,于是工厂开始生产奥迪车所需要的LED显示屏,然后在卖车的时候客户只要对销售顾问说:我要购买奥迪A4L 带有LED显示屏的这款车,限售顾问就给客户提供A4L LED显示屏的车,而不用自己去创建A4L显示屏的车

工厂模式优缺点

1、工厂模式可以降低代码重复。如果创建B过程都很复杂,需要一定的代码量,而且很多地方都要用到,那么就会有很多的重复代码。可以把这些创建对象B的代码放到工厂里统一管理。既减少了重复代码,也方便以后对B的维护。

2、工厂模式可以减少错误,因为工厂管理了对象的创建逻辑,使用者不需要知道具体的创建过程,只管使用即可,减少了使用者因为创建逻辑导致的错误。

简单工厂案例演示

如果不使用工厂模式,那我们需要奥迪A4L和A6L的话就需要自己创建对象如下:

如果使用简单工厂的话那创建对象的过程就交给了工厂来创建,简单工厂包含下面角色:

  • 工厂类角色:工厂模式的核心部分,用来创建产品,包含一些逻辑判断。
  • 抽象产品角色:具体的产品继承的父类或者实现的接口
  • 具体产品角色:工厂类角色创建的对象就是具体产品的实例,即具体类实现

代码实现:

抽象产品&&具体产品类代码:

 工厂类代码:

 这个时候客户就可以通过工厂创建奥迪汽车了

 简单工厂优缺点:优点就是对象创建和使用的职责分离;缺点就是不符合开闭原则,每次添加新产品需要修改工厂类,产品类较多的时候不利于工厂类的维护。

工厂方法模式案例演示

         工厂方法就是定义一个创建对象的接口,接口中定义创建对象的方法,不同的工厂类实现这个接口并重写该方法。也就是每新增一个产品只需要增加该产品对应的具体的工厂实现类。优点就是符合了开闭原则,缺点就是每增加一个产品都需要增加一个具体产品类和实现工厂类,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度。工厂方法模式包含的角色如下:

  • 抽象工厂角色:工厂方法模式的核心部分,是具体工厂角色必须实现的接口或者必须继承的父类,在 Java 中它由抽象类或者接口来实现。 
  • 具体工厂角色:创建产品的具体工厂实现类
  • 抽象产品角色:具体的产品继承的父类或者实现的接口
  • 具体产品角色:工厂类角色创建的对象就是具体产品的实例,即具体类实现

代码实现:

奥迪产品类代码:

 工厂类代码:

客户调用代码:

 抽象工厂案例演示

        抽象工厂模式主要用于创建相关对象的家族。当一个产品族中需要被设计在一起工作时,通过抽象工厂模式,能够保证客户端始终只使用同一个产品族中的对象;并且通过隔离具体类的生成,使得客户端不需要明确指定具体生成类;所有的具体工厂都实现了抽象工厂中定义的公共接口,因此只需要改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。角色包括:

  • 抽象工厂角色:工厂方法模式的核心部分,是具体工厂角色必须实现的接口或者必须继承的父类,在 Java 中它由抽象类或者接口来实现。 
  • 具体工厂角色:创建产品的具体工厂实现类
  • 抽象产品角色:具体的产品继承的父类或者实现的接口
  • 具体产品角色:工厂类角色创建的对象就是具体产品的实例,即具体类实现

        通过抽象工厂我们可以实现下面效果,比如奥迪A4L使用型号A的LED显示屏和A型号的发动机,而奥迪A6L使用B型号的LED显示屏和B型号的发动机,在为A4L和A6L生产相关配件时无需定制配件型号,可以自动根据车型匹配对应的型号配件。

发动机型号代码:

 LED显示屏型号代码:

 工厂类代码如下:

 客户调用代码:

工厂方法模式与抽象工厂模式的区别在于:

1、工厂方法只有一个抽象产品类和一个抽象工厂类,但可以派生出多个具体产品类和具体工厂类,每个具体工厂类只能创建一个具体产品类的实例。

2、抽象工厂模式拥有多个抽象产品类(产品族)和一个抽象工厂类,每个抽象产品类可以派生出多个具体产品类;抽象工厂类也可以派生出多个具体工厂类,同时每个具体工厂类可以创建多个具体产品类的实例
 

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

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

相关文章

【java 多线程】并发设计模式-两阶段终止模式(对interrupt的理解)

📋 个人简介 💖 作者简介:大家好,我是阿牛,全栈领域优质创作者。😜📝 个人主页:馆主阿牛🔥🎉 支持我:点赞👍收藏⭐️留言&#x1f4d…

惊艳!阿里出品“Java全栈进阶宝典”,广度与深度齐头并进

前言 据有关数据统计,目前来看,大大小小的招聘网站上面,Java岗的招聘量仍然是最多的,基本是其他语言的3倍以上,由于目前Java所处的统治级地位,单就数量来看,Java语言实现的系统是海量的&#x…

linux安装MongoDB

环境说明 系统CentOS:CentOS7 mongodb版本 4.2.24 下载 官网下载地址 Download MongoDB Community Server | MongoDB 某云盘 链接:https://pan.baidu.com/s/1G4AC3h5rvz9WM3fx4gJzbA 提取码:ojkl 上传解压 在根目录下创建opt文件夹…

【数据分析之道-基础知识(九)】推导式

文章目录专栏导读1、前言2、列表推导式3、集合推导式4、字典推导式5、元组推导式专栏导读 ✍ 作者简介:i阿极,CSDN Python领域新星创作者,专注于分享python领域知识。 ✍ 本文录入于《数据分析之道》,本专栏针对大学生、初级数据分…

C语言学习1--------Visual Studio集成开发环境的搭建

C语言学习1--------Visual Studio集成开发环境的搭建适合初学者适用集成开发环境下载 Visual Studio 2019安装 Visual Studio 2019安装工作负载为C自定义安装位置激活 Visual Studio适合初学者适用集成开发环境 建议初学者适用最新的——Visual Studio 2019为集成开发环境。 部…

【数据库原理 • 五】数据库安全性与完整性

前言 数据库技术是计算机科学技术中发展最快,应用最广的技术之一,它是专门研究如何科学的组织和存储数据,如何高效地获取和处理数据的技术。它已成为各行各业存储数据、管理信息、共享资源和决策支持的最先进,最常用的技术。 当前…

【C++11那些事儿(一)】

文章目录一、C11简介二、列表初始化2.1 C98中{}的初始化问题2.2 C11中的列表初始化三、各种小语法3.1 auto3.2 decltype3.3 nullptr3.4 范围for四、STL中的一些变化五、左/右值引用和移动语义(本篇重点)5.1 做值引用和右值引用5.2 左值引用与右值引用比较…

【快乐手撕LeetCode题解系列】—— 复制带随机指针的链表

【快乐手撕LeetCode题解系列】—— 复制带随机指针的链表😎前言🙌复制带随机指针的链表🙌画图分析:😍思路分析:😍源代码分享:😍总结撒花💞😎博客昵…

shell结构化命令中for命令

shell脚本编程系列 for var in list docommands done读取列表中的值 每次遍历值列表时,for命令会将列表中的下一个值赋值给变量 #!/bin/bash# basic for commandfor test in Alabama Alaska Arizona Arkansas California Coloradodoecho The next state is $testdo…

第07章_面向对象编程(进阶)

第07章_面向对象编程(进阶) 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 本章专题与脉络 1. 关键字:this 1.1 this是什么? 在Java中,this关键字不算难理解…

关于图像分割的预处理 transform

目录 1. 介绍 2. 关于分割中的 resize 问题 3. 分割的 transform 3.1 随机缩放 RandomResize 3.2 随机水平翻转 RandomHorizontalFlip 3.3 随机竖直翻转 RandomVerticalFlip 3.4 中心裁剪 RandomCrop 3.5 ToTensor 3.6 normalization 3.7 Compose 4. 预处理结果可视…

WPF mvvm框架Stylet使用教程-基础用法

Stylet框架基础用法 安装Nuget包 在“管理Nuget程序包”中搜索Stylet,查看Stylet包支持的net版本,然后选择第二个Stylet.Start包进行安装,该包会自动安装stylet并且生成基本的配置 注意事项:安装时要把需要安装的程序设为启动项…

第06章_面向对象编程(基础)

第06章_面向对象编程(基础) 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 本章专题与脉络 学习面向对象内容的三条主线 Java类及类的成员:(重点&…

《QT+CGAL网格处理——网格重建》

QT+CGAL网格处理——网格重建 一、重建效果二、代码分析显示代码格式转换彩色网格显示三、后续一、重建效果 二、代码分析 显示 1、依旧采取VTK显示,参照《QT+PCL》; 2、点数据、网格数据依旧采用pcl数据结构,cgal处理完成后转换格式即可 界面参照:

微服务学习-SpringCloud -Nacos (心跳机制及健康检查源码学习)

文章目录心跳机制与健康检查流程图心跳机制与健康检查总结详细源码说明当多个服务进行注册时,如何解决注册表并发冲突问题?心跳机制与健康检查流程图 心跳机制与健康检查总结 微服务在启动注册Nacos时,会创建一个定时任务,定时向服务端发生…

基于文心一言的底层视觉理解,百度网盘把「猫」换成了「黄色的猫」

随着移动互联网的一路狂飙,手机已经成为人们的新器官。出门不带钥匙可以,不带手机却是万万不可以的。而手机上,小小的摄像头也越来越成为各位「vlogger」的口袋魔方。每天有超过数亿的照片和视频被上传到百度网盘中,这些照片和视频…

Nginx 实战-负载均衡

一、负载均衡今天学习一下Nginx的负载均衡。由于传统软件建构的局限性,加上一台服务器处理能里的有限性,在如今高并发、业务复杂的场景下很难达到咱们的要求。但是若将很多台这样的服务器通过某种方式组成一个整体,并且将所有的请求平均的分配…

Kafka的命令行操作

一、topic命令 下面Windows命令需要把cmd路径切换到bin/windows下。 而Linux命令只需要在控制台切换到bin目录下即可。 下面都以Windows下的操作为例,在Linux下也是一样的。 1.1 查看主题命令的参数 kafka-topics.bat # Windows kafka-topics.sh # Linux输…

机器学习中的数学——学习曲线如何区别欠拟合与过拟合

通过这篇博客,你将清晰的明白什么是如何区别欠拟合与过拟合。这个专栏名为白话机器学习中数学学习笔记,主要是用来分享一下我在 机器学习中的学习笔记及一些感悟,也希望对你的学习有帮助哦!感兴趣的小伙伴欢迎私信或者评论区留言&…

关于人工智能前沿信息获取的精品课程

通过观看在线课程可以很方便掌握获取人工智能前沿信息的方法,本文将介绍一些相关课程。 1. 武汉大学黄如花教授的信息检索中文课程知识面广泛,内容详尽,讲解清晰,课程的视频见课程 56。 ​ 课程 56 武汉大学黄如花教授的《信息检…