创建型设计模式 - 抽象工厂模式 - 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,一经查实,立即删除!

相关文章

AI模型私人订制

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

快速部署supervisord详解

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

Linux---进程控制

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

Linux环境编程基础

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

【nodejs】前后端身份认证

前后端身份认证 一、web开发模式 服务器渲染,前后端分离。 不同开发模式下的身份认证: 服务端渲染推荐使用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 个部分;他们是: 词嵌入 Gensim 库 开发 Word2Vec 嵌入 可视化单词嵌入 加载 Google 的 Word2Vec 嵌入 加载斯坦福大学的 GloVe 嵌入 词嵌入 单词嵌入是一种提供单词的…

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

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

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

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

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

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

【Linux】Linux

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

thinkphp6.0升级到8.0

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

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

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

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

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

Debezium发布历史40

原文地址: https://debezium.io/blog/2018/09/20/materializing-aggregate-views-with-hibernate-and-debezium/ 欢迎关注留言,我是收集整理小能手,工具翻译,仅供参考,笔芯笔芯. 使用 Hibernate 和 Debezium 实现聚合…

2021-06-25 51蛋骗鸡按键切合LED

缘由ISIS 7 Professional_有问必答-CSDN问答 #include "REG52.h" sbit K1 P3^0; sbit K2 P3^1; sbit K3 P3^2; sbit K4 P3^3; void main() {unsigned char Xd0,xz0,cs0;unsigned int wei0;P1255;while(1){if(K10&&Xd0){P10;while(K10);}if(K20&&…

【Redis-05】Redis如何实现保存键值对的保存及过期键的管理策略

在之前的文章我们介绍过,Redis服务器在启动之初,会初始化RedisServer的实例,在这个实例中存在很多重要的属性结构,同理本篇博客中介绍的数据库实现原理也会和其中的某些属性相关,我们继续看一下吧。 1.服务器和客户端…

【后端】Docker学习笔记

文章目录 Docker一、Docker安装(Linux)二、Docker概念三、Docker常用命令四、数据卷五、自定义镜像六、网络七、DockerCompose Docker Docker是一个开源平台,主要基于Go语言构建,它使开发者能够将应用程序及其依赖项打包到一个轻…

多维时序 | MATLAB实现SSA-CNN-GRU-SAM-Attention麻雀算法优化卷积网络结合门控循环单元网络融合空间注意力机制多变量时间序列预测

多维时序 | MATLAB实现SSA-CNN-GRU-SAM-Attention麻雀算法优化卷积网络结合门控循环单元网络融合空间注意力机制多变量时间序列预测 目录 多维时序 | MATLAB实现SSA-CNN-GRU-SAM-Attention麻雀算法优化卷积网络结合门控循环单元网络融合空间注意力机制多变量时间序列预测预测效…

uni-app模版(扩展插件)

锋哥原创的uni-app视频教程: 2023版uniapp从入门到上天视频教程(Java后端无废话版),火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版),火爆更新中...共计23条视频,包括:第1讲 uni…

使用css实现 Typora markdown 标题自动编号

第一,找到主题文件夹 第二,复制下面代码放入 AutoNumber.css文件中 body {counter-reset: h1; }#write h1, .markdown-section h1 {counter-reset: h2; }#write h2, .markdown-section h2 {counter-reset: h3; }#write h3, .markdown-section h3 {counte…