创建型设计模式 - 抽象工厂模式 - 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.hqwc.cn/news/305915.html

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

相关文章

实时交通标志检测和分类(代码)

交通标志检测和分类技术是一种基于计算机视觉和深度学习的先进技术,能够识别道路上的各种交通标志,并对其进行分类和识别。这项技术在智能交通系统、自动驾驶汽车和交通安全管理领域具有重要的应用前景。下面我将结合实时交通标志检测和分类的重要性、技…

Java技术栈 —— Redis的雪崩、穿透与击穿

Java技术栈 —— Redis的雪崩、穿透与击穿 〇、实验的先导条件(NginxJmeter)一、Redis缓存雪崩、缓存穿透、缓存击穿1.1 雪崩1.2 穿透1.3 击穿 二、Redis应用场景——高并发2.1 单机部署的高并发问题与解决(JVM级别锁)2.2 集群部署…

简述Redis备份策略以及对应的实现机制

引言 Redis作为高性能的内存数据库,数据的安全性至关重要。一旦数据丢失,可能会对业务造成重大影响。因此,备份Redis数据是每个Redis使用者都必须考虑的问题。本文将介绍Redis的备份策略以及对应的实现机制。 一、备份策略 1.1 定期备份 …

【零基础入门VUE】VueJS - 实例

✍面向读者:所有人 ✍所属专栏:零基础入门VUE专栏https://blog.csdn.net/arthas777/category_12537076.html 目录 句法 vue_instance.js 输出 例子 输出 实施例1 实施例2 例子 例子 要开始使用 VueJS,我们需要创建 Vue 实例&#xf…

神经网络常用模型总结

本文目录: 【一】目标检测中IOU的相关概念与计算【二】目标检测中NMS的相关概念与计算【三】One-stage目标检测与Two-stage目标检测的区别?【四】哪些方法可以提升小目标检测的效果?【五】ResNet模型的特点以及解决的问题?【六】R…

【C语言】数据结构——排序(一)

💗个人主页💗 ⭐个人专栏——数据结构学习⭐ 💫点击关注🤩一起学习C语言💯💫 目录 导读:数组打印与交换1. 插入排序1.1 直接插入排序1.1.1 基本思想1.1.2 实现代码1.1.3 图解 1.2 希尔排序1.2.1…

刺猬目标检测数据集VOC格式500张

刺猬是一种可爱的小型哺乳动物,被广泛分布在欧洲、亚洲、非洲和新西兰等地的草地、森林、灌木丛以及城市郊区等地方。刺猬的身体被短而密的刺毛所覆盖,这些刺毛是其最具特征性的外观特征,也是为了自我保护而设计的武器。 刺猬主要以昆虫、蠕…

手机/平板实现电脑第三屏-记录极简

软件: 手机 平板 : moonlight 电脑: 1 KtzeAbyss/Easy-Virtual-Display 2 Parsec Virtual Display Driver https://builds.parsec.app/vdd/parsec-vdd-0.38.0.0.exe 3 LizardByte/Sunshine: Self-hosted game stream host for Moonlight. (gith…

鸿蒙原生应用再添新丁!搜狐集团、航旅纵横入局鸿蒙

鸿蒙原生应用再添新丁!搜狐集团、航旅纵横入局鸿蒙 来自 HarmonyOS 微博12月28日消息,搜狐集团宣布与华为达成全面合作!搜狐新闻近期将完成#鸿蒙原生应用#核心功能版本,搜狐视频也启动了#鸿蒙原生应用#开发!这不仅是一…

Grafana Loki 组件介绍

Loki 日志系统由以下3个部分组成: Loki是主服务器,负责存储日志和处理查询。Promtail是专为loki定制的代理,负责收集日志并将其发送给 loki 。Grafana用于 UI展示。 Distributor Distributor 是客户端连接的组件,用于收集日志…

学习STM32获取相关资料的官方网站

ARM公司官网 Building the Future of Computing – ArmTogether with its vast ecosystem, Arm technology is changing the world again, building the future of computing and bringing ideas to life.https://www.arm.com/STM32单片机是ARM公司开发的基于Cortex-M架构的内…

[BUG] Hadoop-3.3.4集群yarn管理页面子队列不显示任务

1.问题描述 使用yarn调度任务时,在CapacityScheduler页面上单击叶队列(或子队列)时,不会显示应用程序任务信息,root队列可以显示任务。此外,FairScheduler页面是正常的。 No matching records found2.原…