创建型设计模式 - 抽象工厂模式 - JAVA

创建型设计模式 - 抽象工厂设计模式

    • 一. 简介
    • 二. 列子
      • 2.1 定义电脑的抽象类和子类
      • 2.2 定义抽象工厂类和其实现类
      • 2.3 测试
    • 三. 抽象工厂设计模式的好处
    • 四. 抽象工厂模式的案例

前言

这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。 作者:神的孩子都在歌唱

抽象工厂设计模式是创建模式之一。抽象工厂模式 几乎与 工厂模式 相似,只是它更像工厂的工厂

一. 简介

看本片文章前,可以先看 工厂设计模式,您会注意到我们有一个 Factory 类。该工厂类根据提供的输入返回不同的子类,工厂类使用 if-else 或 switch 语句来实现此目的。在抽象工厂模式中,我们摆脱了 if-else 块,每个子类都有一个工厂类,然后设置一个抽象工厂类工厂类去实现这个抽象工厂。工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。大白话可能没办法讲清楚,接下来会通过代码解释,这样就能很容易掌握和理解工厂模式抽象工厂模式之间的细微差别。

二. 列子

就像我们的工厂模式案例一样,我们将使用相同的超类和子类

假如我们要做一个电脑购买系统,里面有台式机 和笔记本 ,他们是 电脑(Computer)类别,在购买的时候可以选择内存(memory)和磁盘(disk)两个参数。可是台式机又有 华为台式机 (HuaWeiPc)小米台式机(XiaoMiPc) , 笔记本又有 华为笔记本(HuaWeiLaptop)小米笔记本(XiaoMiLaptop)台式机和笔记本是一个等级,华为和小米又是一个等级,这种多态性就适合使用抽象工厂设计模式,类图如下:

image-20231227233927261

这里设置一个抽象工厂(ComputerAbstractFactory), 台式机 (PcFactory),笔记本(LaptopFactory)这两个工厂实现他,创建一个工厂(ComputerFactory)给客户端提供创建子类的入口点

2.1 定义电脑的抽象类和子类

电脑抽象类

/*** 电脑抽象类** @author chenyunzhi* @date 2023/12/27 0:09*/
public abstract class Computer {/*** 内存抽象方法* @return string*/public abstract String memory();/*** 磁盘抽象方法* @return string*/public abstract String disk();@Overridepublic String toString() {return "内存:" + memory() + "  " + "磁盘:" + disk();}
}

华为台式机

/*** 华为台式机** @author chenyunzhi* @date 2023/12/27 0:22*/
public class HuaWeiPc extends Computer {private final String memory;private final String disk;public HuaWeiPc(String memory, String disk) {this.memory = memory;this.disk = disk;}@Overridepublic String memory() {return this.memory;}@Overridepublic String disk() {return this.disk;}
}

小米台式机

/*** 小米台式机** @author chenyunzhi* @date 2023/12/27 0:23*/
public class XiaoMiPc extends Computer{private final String memory;private final String disk;public  XiaoMiPc(String memory, String disk) {this.memory = memory;this.disk = disk;}@Overridepublic String memory() {return this.memory;}@Overridepublic String disk() {return this.disk;}
}

华为笔记本

/*** 华为笔记本** @author chenyunzhi* @date 2023/12/27 0:26*/
public class HuaWeiLaptop extends Computer{private final String memory;private final String disk;public HuaWeiLaptop(String memory, String disk) {this.memory = memory;this.disk = disk;}@Overridepublic String memory() {return this.memory;}@Overridepublic String disk() {return this.disk;}
}

小米笔记本

/*** 小米笔记本** @author chenyunzhi* @date 2023/12/27 0:30*/
public class XiaoMiLaptop extends Computer{private final String memory;private final String disk;public XiaoMiLaptop(String memory, String disk) {this.memory = memory;this.disk = disk;}@Overridepublic String memory() {return this.memory;}@Overridepublic String disk() {return this.disk;}
}

2.2 定义抽象工厂类和其实现类

电脑抽象工厂

创建一个接口或者抽象类都可以

/*** 电脑抽象工厂** @author chenyunzhi* @date 2023/12/27 22:53*/
public interface  ComputerAbstractFactory {/*** 创建华为电脑接口*/public Computer createHuaWeiComputer();/*** 创建小米电脑接口*/public Computer createXiaoMiComputer();
}

台式机工厂

/*** 台式机工厂** @author chenyunzhi* @date 2023/12/27 21:57*/
public class PcFactory implements ComputerAbstractFactory{private final String memory;private final String disk;public PcFactory(String memory, String disk) {this.memory = memory;this.disk = disk;}@Overridepublic Computer createHuaWeiComputer() {return new HuaWeiPc(memory, disk);}@Overridepublic Computer createXiaoMiComputer() {return new XiaoMiPc(memory, disk);}
}

笔记本工厂

/*** 笔记本工厂** @author chenyunzhi* @date 2023/12/27 23:08*/
public class LaptopFactory implements ComputerAbstractFactory{private final String memory;private final String disk;public LaptopFactory(String memory, String disk) {this.memory = memory;this.disk = disk;}@Overridepublic Computer createHuaWeiComputer() {return new HuaWeiLaptop(memory, disk);}@Overridepublic Computer createXiaoMiComputer() {return new XiaoMiLaptop(memory, disk);}
}

2.3 测试

/*** 测试** @author chenyunzhi* @date 2023/12/27 23:25*/
public class TestDesignPatterns {public static void main(String[] args) {testDesignPatterns();}private static void testDesignPatterns() {Computer huaWeiComputer = ComputerFactory.getHuaWeiComputer(new PcFactory("32 GB", "1 TB"));System.out.println("华为pc电脑 = " + huaWeiComputer);Computer xiaoMiComputer = ComputerFactory.getXiaoMiComputer(new PcFactory("16 GB", "512 GB"));System.out.println("小米pc电脑 = " + xiaoMiComputer);Computer huaWeiComputer1 = ComputerFactory.getHuaWeiComputer(new LaptopFactory("8 GB", "1 TB"));System.out.println("华为笔记本电脑 = " + huaWeiComputer1);Computer xiaoMiComputer1 = ComputerFactory.getXiaoMiComputer(new LaptopFactory("4 GB", "512 GB"));System.out.println("小米笔记本电脑 = " + xiaoMiComputer1);}
}

image-20231228001553538

三. 抽象工厂设计模式的好处

  • 抽象工厂模式是“工厂的工厂”,可以很容易地扩展以容纳更多的产品,例如我们可以添加另一个子类 ipad 和工厂 ipadFactory。
  • 抽象工厂模式是健壮的,并且避免了工厂模式的条件逻辑。

四. 抽象工厂模式的案例

  • javax.xml.parsers.DocumentBuilderFactory#newInstance()
  • javax.xml.transform.TransformerFactory#newInstance()
  • javax.xml.xpath.XPathFactory#newInstance()

作者:神的孩子都在歌唱
本人博客:https://blog.csdn.net/weixin_46654114
转载说明:务必注明来源,附带本人博客连接。

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

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

相关文章

如果xm_bmgys的长度大于3就每行五列,否则每行两列

如果需要根据xm_bmgys的长度动态调整表格的列数&#xff0c;可以使用Freemarker的条件判断语句进行处理。 下面是一个更新后的示例代码&#xff1a; <table><#if xm_bmgys?size > 3> <!-- 如果长度大于3&#xff0c;每行五列 --><#list xm_bmgys a…

【mysql】数据处理格式化、转换、判断

数据处理 判断是否超时&#xff0c;时间是否大于当前时间计算分钟数时间格式化处理如果数值类型进行转换字符类型字符拼接case-when代替if-else判断数据空&#xff08;特殊&#xff1a;含空数据、空字符处理&#xff09; select /*判断是否超时&#xff0c;时间是否大于当前…

2024任务驱动Hadoop应用讲课提纲

文章目录 为何采用任务驱动&#xff1f;任务驱动Hadoop应用课程概述项目一&#xff1a;搭建Hadoop集群任务1&#xff1a;搭建完全分布式Hadoop集群1. 思路解析2. 编程实现3. 知识点讲解4. 总结提高 任务2&#xff1a;搭建高可用Hadoop集群&#xff08;HA模式&#xff09;1. 思路…

c++编程大师挑战赛-静夜思

静夜思 暂无标签 题目统计 全部提交 时间限制&#xff1a;C/C 1000MS&#xff0c;其他语言 2000MS 内存限制&#xff1a;C/C 256MB&#xff0c;其他语言 512MB 难度&#xff1a;简单 出题人&#xff1a;admin 描述 请在屏幕上输出《静夜思》&#xff0c;每句诗后单独占据1行…

AI模型私人订制

使用AI可以把你的脸换成明星的脸&#xff0c;可以用于直播、录播。 AI换脸1 也可以把视频中明星的脸换成你的脸 AI换脸2 之所以能够替换成功&#xff0c;是因为我们有一个AI人物模型&#xff0c;AI驱动这个模型就可以在录制视频的时候替换指定人物的脸。AI模型从哪里来&…

题目 1669: 求圆的面积

题目很简单&#xff0c;已知半径r&#xff0c;求一个圆的面积是多大。 圆的面积公式&#xff0c;圆周率Π用Pi表示&#xff0c; R为圆的半径&#xff0c;面积为: SPi*(R^2) 输入格式 输入一个半径&#xff0c;浮点类型~ 输出格式 输出它对应的面积大小&#xff0c;…

快速部署supervisord详解

Supervisor是一个用于监控和管理进程的工具。它可以在Unix-like系统中启动、停止、重启和管理后台进程&#xff0c;确保这些进程始终保持运行状态。 yum check-update 更新yum软件包索引 yum install epel-release -y 下载eprl源 yum install supervisor -y 直接yu…

Linux---进程控制

一、进程创建 fork函数 在Linux中fork函数是非常重要的函数&#xff0c;它从已存在进程中创建一个新进程&#xff0c;原进程为父进程 fork函数的功能&#xff1a; 分配新的内存和内核数据结构给子进程将父进程部分数据结构内容拷贝至子进程添加子进程到系统的进程列表中fork返…

Linux环境编程基础

静态库和动态库 静态库和动态库 在实际开发中&#xff0c;我们把通用的函数和类分文件编写&#xff0c;称之为库。在其它的程序中&#xff0c;可以使用库中的函数和类。 一般来说&#xff0c;通用的函数和类不提供源代码文件&#xff08;安全性、商业机密&#xff09;&#x…

说出Servlet的生命周期,并说出Servlet和CGI的区别

Servlet的生命周期可以概括为三个阶段&#xff1a;初始化阶段、处理请求阶段和销毁阶段。 初始化阶段&#xff1a;Servlet在第一次被加载到Web服务器时&#xff0c;服务器会创建一个Servlet实例。然后服务器调用Servlet的init()方法进行初始化操作。这个方法只会在Servlet第一…

【nodejs】前后端身份认证

前后端身份认证 一、web开发模式 服务器渲染&#xff0c;前后端分离。 不同开发模式下的身份认证&#xff1a; 服务端渲染推荐使用Session认证机制前后端分离推荐使用JWT认证机制 二、session认证机制 1.HTTP协议的无状态性 了解HTTP协议的无状态性是进一步学习Session认…

How to Develop Word Embeddings in Python with Gensim

https://machinelearningmastery.com/develop-word-embeddings-python-gensim/ 本教程分为 6 个部分;他们是&#xff1a; 词嵌入 Gensim 库 开发 Word2Vec 嵌入 可视化单词嵌入 加载 Google 的 Word2Vec 嵌入 加载斯坦福大学的 GloVe 嵌入 词嵌入 单词嵌入是一种提供单词的…

【YOLO系列】yolo V1 ,V3,V5,V8 解释

文章目录 yolo V1 模型结构图通道数 的 物理意义是什么&#xff1f;输出 7730 怎么理解&#xff1f;YOLO v1 损失函数LOSS yolo V3yolo V5yolo V8 视频来源&#xff1a;https://www.bilibili.com/video/BV13K411t7Zs/ AI视频小助理 一、YOLO系列的目标检测算法&#xff0c;其中…

python+opencv实现图片/短视频一键去水印

目录 0 前言1 准备工作2 读取图片或视频3 添加回调获取鼠标绘制水印区域4 调用opencv函数5 绘制蒙版主循环6 去水印主循环总结 0 前言 在制作ppt个人文章或者分享图片过程中&#xff0c;经常会遇到一些带有水印的情况&#xff0c;不少人都希望能够去除这些水印&#xff0c;提高…

2024如何成为一名合格的全栈开发者

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版&#xff0c;欢迎购买。点击进入详情 在当今快速发展的技术环境中&#xff0c;对多才多艺和技能熟练的专业人员的需求正在不断增加。 全栈开发人员是一个非常受欢迎的角色。 本文将深入了解什么是全栈…

Ubuntu上如何找到设备,打印串口日志

dmesg 找设备 sudo mincom -s 配置minicom mincom 打印串口日志 PS: Windows上使用MobaXterm / putty / Xshell / SecureCRT等 ubuntu串口的安装和使用&#xff08;usb转串口&#xff09;_ubuntu上如何把usb设备映射到tty-CSDN博客

【Linux】Linux

Linux 文章目录 Linux1. 简介2. 目录结构3. vi/vim 的使用4. 网络配置4.1 配置网络ip地址4.2 配置主机名或ip映射4.3 远程登陆及上传下载 5. 系统管理5.1 service 服务管理&#xff08;CentOS 6 版本&#xff09;5.2 systemctl 服务管理&#xff08;CentOS 7 版本&#xff09;5…

thinkphp6.0升级到8.0

目录 一&#xff1a;升级过程 二&#xff1a;报错处理 最近写的项目需要使用thinkphp8.0&#xff0c;之前的老项目需要从php6.0升级到8.0&#xff0c;特此记录下升级过程。 一&#xff1a;升级过程 查看版本&#xff1a; php think version,我目前的版本是6.1.4 生成thin…

Java项目:103SSM酒店管理系统

博主主页&#xff1a;Java旅途 简介&#xff1a;分享计算机知识、学习路线、系统源码及教程 文末获取源码 一、项目介绍 酒店管理系统基于SpringSpringMVCMybatis开发&#xff0c;功能简单&#xff0c;可用于毕设或者课程设计。 管理员功能如下&#xff1a; 房间管理住客入住…

图像去雾/图像去雨(matlab/python)

图像去雾和图像去雨是计算机视觉领域的两个重要问题&#xff0c;旨在改善被大气条件或降雨影响而模糊或噪声化的图像质量。这两个技术在很多实际应用中具有广泛的价值&#xff0c;包括无人驾驶、安防监控、航空航天等领域。下面将分点介绍图像去雾和图像去雨的相关内容。 1. 图…