Java 中的抽象工厂模式:优雅地掌握对象创建

文章目录

    • 一、概述
    • 三、抽象工厂设计模式的意图
    • 四、抽象工厂模式的详细解释及实际示例
    • 五、Java 中抽象工厂模式的编程示例
    • 六、抽象工厂模式类图
    • 七、Java 中何时使用抽象工厂模式
    • 八、抽象工厂模式 Java 教程
    • 九、抽象工厂模式的优点和权衡
    • 十、Java 中抽象工厂模式的实际应用
    • 十一、相关 Java 设计模式
    • 十二、参考和致谢
    • 十三、源码下载

一、概述

在 Java 开发中,设计模式起着至关重要的作用,它们可以帮助我们构建更加灵活、可维护和可扩展的软件系统。本文将深入探讨 Java 中的抽象工厂设计模式,包括其意图、详细解释、编程示例、类图、适用场景、教程、优点和权衡、实际应用以及相关设计模式。同时,还将提供示例代码的下载链接,方便读者进行学习和实践。

三、抽象工厂设计模式的意图

Java 中的抽象工厂模式提供了一个接口,用于创建一系列相关或依赖的对象,而无需指定它们的具体类。这增强了软件设计的模块化和灵活性。

四、抽象工厂模式的详细解释及实际示例

  1. 实际示例
    • 想象一家家具公司,它使用 Java 中的抽象工厂模式来生产各种风格的家具,如现代风格、维多利亚风格和乡村风格。每种风格都包括椅子、桌子和沙发等产品。为了确保每种风格的一致性,公司使用抽象工厂模式。
    • 在这个场景中,抽象工厂是一个用于创建相关家具对象系列(椅子、桌子、沙发)的接口。每个具体工厂(现代家具工厂、维多利亚家具工厂、乡村家具工厂)实现抽象工厂接口,并创建一组与特定风格匹配的产品。这样,客户可以创建一整套现代或维多利亚风格的家具,而无需担心它们的实例化细节。这保持了一致的风格,并允许轻松地将一种风格的家具替换为另一种风格。
  2. 通俗解释
    • 工厂的工厂;一个将单个但相关/依赖的工厂组合在一起而不指定它们具体类的工厂。
  3. 维基百科解释
    • 抽象工厂模式提供了一种封装一组具有共同主题的单个工厂的方法,而无需指定它们的具体类。

五、Java 中抽象工厂模式的编程示例

为了使用抽象工厂模式在 Java 中创建一个王国,我们需要具有共同主题的对象。精灵王国需要一个精灵国王、精灵城堡和精灵军队,而兽人王国需要一个兽人国王、兽人城堡和兽人军队。王国中的对象之间存在依赖关系。

  1. 首先,我们为王国中的对象定义一些接口和实现。
public interface Castle {String getDescription();
}
public interface King {String getDescription();
}
public interface Army {String getDescription();
}
// 精灵实现
public class ElfCastle implements Castle {static final String DESCRIPTION = "This is the elven castle!";@Overridepublic String getDescription() {return DESCRIPTION;}
}
public class ElfKing implements King {static final String DESCRIPTION = "This is the elven king!";@Overridepublic String getDescription() {return DESCRIPTION;}
}
public class ElfArmy implements Army {static final String DESCRIPTION = "This is the elven Army!";@Overridepublic String getDescription() {return DESCRIPTION;}
}
// 兽人实现类似...
  1. 然后,我们为王国工厂定义抽象和实现。
public interface KingdomFactory {Castle createCastle();King createKing();Army createArmy();
}
public class ElfKingdomFactory implements KingdomFactory {@Overridepublic Castle createCastle() {return new ElfCastle();}@Overridepublic King createKing() {return new ElfKing();}@Overridepublic Army createArmy() {return new ElfArmy();}
}
// 兽人实现类似...
  1. 现在,我们可以为不同的王国工厂设计一个工厂。在这个例子中,我们创建了FactoryMaker,负责返回ElfKingdomFactoryOrcKingdomFactory的实例。客户可以使用FactoryMaker创建所需的具体工厂,而具体工厂将反过来生产不同的具体对象(派生自ArmyKingCastle)。在这个例子中,我们还使用了一个枚举来参数化客户将请求的王国工厂类型。
public static class FactoryMaker {public enum KingdomType {ELF, ORC}public static KingdomFactory makeFactory(KingdomType type) {return switch (type) {case ELF -> new ElfKingdomFactory();case ORC -> new OrcKingdomFactory();};}
}
  1. 以下是示例应用的主函数:
LOGGER.info("elf kingdom");
createKingdom(Kingdom.FactoryMaker.KingdomType.ELF);
LOGGER.info(kingdom.getArmy().getDescription());
LOGGER.info(kingdom.getCastle().getDescription());
LOGGER.info(kingdom.getKing().getDescription());
LOGGER.info("orc kingdom");
createKingdom(Kingdom.FactoryMaker.KingdomType.ORC);
LOGGER.info(kingdom.getArmy().getDescription());
LOGGER.info(kingdom.getCastle().getDescription());
LOGGER.info(kingdom.getKing().getDescription());

程序输出:

07:35:46.340 [main] INFO com.iluwatar.abstractfactory.App -- elf kingdom
07:35:46.343 [main] INFO com.iluwatar.abstractfactory.App -- This is the elven army!
07:35:46.343 [main] INFO com.iluwatar.abstractfactory.App -- This is the elven castle!
07:35:46.343 [main] INFO com.iluwatar.abstractfactory.App -- This is the elven king!
07:35:46.343 [main] INFO com.iluwatar.abstractfactory.App -- orc kingdom
07:35:46.343 [main] INFO com.iluwatar.abstractfactory.App -- This is the orc army!
07:35:46.343 [main] INFO com.iluwatar.abstractfactory.App -- This is the orc castle!
07:35:46.343 [main] INFO com.iluwatar.abstractfactory.App -- This is the orc king!

六、抽象工厂模式类图

在这里插入图片描述

七、Java 中何时使用抽象工厂模式

在以下情况下使用 Java 中的抽象工厂模式:

  1. 系统应该独立于其产品的创建、组合和表示方式。
  2. 需要用多个产品系列之一配置系统。
  3. 一系列相关的产品对象必须一起使用,以强制一致性。
  4. 想要提供产品的类库,只公开它们的接口,而不是它们的实现。
  5. 依赖项的生命周期比消费者的生命周期短。
  6. 需要使用运行时值或参数构造依赖项。
  7. 需要在运行时从一个产品系列中选择使用哪个产品。
  8. 添加新产品或产品系列不应要求对现有代码进行更改。

八、抽象工厂模式 Java 教程

  1. Abstract Factory Design Pattern in Java (DigitalOcean)
  2. Abstract Factory(Refactoring Guru)

九、抽象工厂模式的优点和权衡

  1. 优点
    • 灵活性:无需代码修改即可轻松在产品系列之间切换。
    • 解耦:客户端代码仅与抽象接口交互,提高了可移植性和可维护性。
    • 可重用性:抽象工厂和产品便于在项目中重用组件。
    • 可维护性:对单个产品系列的更改是局部的,简化了更新。
  2. 权衡
    • 复杂性:定义抽象接口和具体工厂会增加初始开销。
    • 间接性:客户端代码通过工厂间接与产品交互,可能会降低透明度。

十、Java 中抽象工厂模式的实际应用

  1. Java Swing 的LookAndFeel类,用于提供不同的外观和感觉选项。
  2. Java 抽象窗口工具包(AWT)中的各种实现,用于创建不同的 GUI 组件。
  3. javax.xml.parsers.DocumentBuilderFactory
  4. javax.xml.transform.TransformerFactory
  5. javax.xml.xpath.XPathFactory

十一、相关 Java 设计模式

  1. 工厂方法:抽象工厂使用工厂方法来创建产品。
  2. 单例模式:抽象工厂类通常实现为单例。
  3. 工厂套件:与抽象工厂类似,但侧重于以灵活的方式配置和管理一组相关对象。

十二、参考和致谢

  1. Design Patterns: Elements of Reusable Object-Oriented Software
  2. Design Patterns in Java
  3. Head First Design Patterns: Building Extensible and Maintainable Object-Oriented Software
  4. Java Design Patterns: A Hands-On Experience with Real-World Examples

十三、源码下载

https://download.csdn.net/download/weixin_42545951/89677296

通过本文的介绍,相信大家对 Java 中的抽象工厂设计模式有了更深入的理解。在实际开发中,合理运用抽象工厂模式可以提高软件的可维护性、可扩展性和灵活性,为构建高质量的软件系统提供有力支持。

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

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

相关文章

【Web UI自动化测试】Web UI自动化测试之框架篇(全网最全)

本文大纲截图: UnitTest框架: PyTest框架: 框架: 框架英文单词 framework,为解决一类事情的功能的集合。需要按照框架的规定(套路)去书写代码。 一、UnitTest框架介绍【文末分享自动化测试学…

使用canal增量同步ES索引库数据

Canal增量数据同步利器 Canal介绍 canal主要用途是基于 MySQL 数据库增量日志解析,并能提供增量数据订阅和消费,应用场景十分丰富。 github地址:https://github.com/alibaba/canal 版本下载地址:https://github.com/alibaba/c…

鸿蒙开发:深入浅出Stage模型(UIAbility组件)

🚀一、UIAbility组件 🔎1.概述 HarmonyOS中的Stage模型是一种基于UIAbility组件的应用程序架构。UIAbility是HarmonyOS系统中用于构建用户界面的基本组件之一。它负责处理应用程序界面的显示和交互。 在Stage模型中,每个应用程序都有一个或…

LLM —— 强化学习(RLHF-PPO和DPO)学习笔记

强化学习整体流程 智能体执行动作与环境进行交互,根据奖励R的反馈结果不断进行更新。 价值函数 奖励将会考虑两个方面的奖励,一个当下的奖励,一个是未来的奖励(为了防止陷入局部最优解)。 LLM强化学习 强化学习模型分…

CTF—杂项学习

1 文件操作隐写 1.1 文件类型识别 1.1.1 File命令 当文件没有后缀名或有后缀名而无法打开时,根据识别出的文件类型来修改后缀名即可正常打开文件,file是Linux下的文件识别命令。 file 文件名 使用场景:不知道后缀名,无法打开文件…

【STM32开发笔记】STM32H7S78-DK上的CoreMark移植和优化--兼记STM32上的printf重定向实现及常见问题解决

【STM32开发笔记】STM32H7S78-DK上的CoreMark移植和优化--兼记STM32上的printf重定向实现及常见问题解决 一、CoreMark简介二、创建CubeMX项目2.1 选择MCU2.2 配置CPU时钟2.3 配置串口功能2.4 配置LED引脚2.5 生成CMake项目 三、基础功能支持3.1 支持记录耗时3.2 支持printf输出…

SEO之网站结构优化(十三-网站地图)

** 初创企业搭建网站的朋友看1号文章;想学习云计算,怎么入门看2号文章谢谢支持: ** 1、我给不会敲代码又想搭建网站的人建议 2、“新手上云”能够为你开启探索云世界的第一步 博客:阿幸SEO~探索搜索排名之道 网站无论大小&…

京存分布式赋能EDA应用

合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。——《老子德经第六十四章》 EDA(Electronic Design Automation 电子设计自动化)是利用计算机,完成对VLSI (V…

OpenCV绘图函数(8)填充凸多边形函数fillConvexPoly()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 填充一个凸多边形。 函数 cv::fillConvexPoly 绘制一个填充的凸多边形。这个函数比 fillPoly 函数快得多。它可以填充的不仅仅是凸多边形&#…

25届最近5年自动化考研院校分析

哈尔滨工程大学 目录 一、学校学院专业简介 二、考试科目指定教材 三、近5年考研分数情况 四、近5年招生录取情况 五、最新一年分数段图表 六、初试大纲复试大纲 七、学费&奖学金&就业方向 一、学校学院专业简介 二、考试科目指定教材 1、考试科目介绍 2、指定…

C++ | Leetcode C++题解之第377题组合总和IV

题目&#xff1a; 题解&#xff1a; class Solution { public:int combinationSum4(vector<int>& nums, int target) {vector<int> dp(target 1);dp[0] 1;for (int i 1; i < target; i) {for (int& num : nums) {if (num < i && dp[i - …

《JavaEE进阶》----4.<SpringMVC①简介、基本操作>

本篇博客讲解 MVC思想、及Spring MVC&#xff08;是对MVC思想的一种实现&#xff09;。 Spring MVC的基本操作、学习了六个注解 RestController注解 RequestMappering注解 RequestParam注解 RequestBody注解 PathVariable注解 RequestPart注解 MVC View(视图) 指在应⽤程序中…

四大名著改编的ip大作,一个巨亏2亿,一个狂赚20亿!选择决定成败!

最近讨论热度比较高的当属《红楼梦》和《西游记》了 胡玫导演的《红楼梦之金玉良缘》耗费了18年的心血&#xff0c;投资了2个多亿 却仅仅只有600万票房&#xff0c;还被网友调侃称“一黛不如一黛” 而由《西游记》改编的游戏《黑神话悟空》&#xff0c;研发10年投资6亿&…

【drools】Rulesengine构建及intelj配置

7.57.0.FinalRulesengineApplication 使用maven构建 intelj 打开文件资源管理器实在是太慢了所以直接把pom 扔到其主页识别为maven项目,自动下载maven包管理器 然后解析依赖: 给maven加一个代理 -DproxyHost=127.0.0.1 -DproxyPort=7890 还是卡主

机器人拾取系统关节机械臂通过NY-PN-EIPZ进行命令控制

关节机械臂是一种精密的机器&#xff0c;旨在模拟人类手臂在订单拣选操作中的运动。这些多功能机器人由多个关节组成&#xff0c;通常有 4 到 7 个轴&#xff0c;使它们能够高度自由地移动&#xff0c;并在仓库内以各种方向和位置接触物品。 制造工厂智能仓库系统中的关节机械臂…

Mobile-Agent项目部署与学习总结(DataWhale AI夏令营)

前言 你好&#xff0c;我是GISer Liu&#xff0c;一名热爱AI技术的GIS开发者&#xff0c;本文是DataWhale 2024 AI夏令营的最后一期——Mobile-Agent赛道&#xff0c;这是作者的学习文档&#xff0c;这里总结一下&#xff0c;和作者一起学习这个多模态大模型新项目吧&#x1f6…

AMEYA360 :“Radisol”,一款可改善智能手机Wi-Fi天线性能的村田电子新产品

株式会社村田制作所开发了村田首款(1)天线抗干扰器件‘Radisol’。Radisol是一款可配备到天线上来抑制无线性能下降的新产品&#xff0c;该产品已于2024年6月开始量产&#xff0c;并已用在Motorola Mobility LLC 2024年8月开始销售的智能手机“Edge系列”新机型。摩托罗拉通过采…

【Qt】垂直布局管理器QVBoxLayout

垂直布局管理器QVBoxLayout 在之前学习Qt的过程中&#xff0c;将控件放在界面上&#xff0c;都是依靠“手动”的方式来布局的&#xff0c;但是手动调整的方式是不科学的。 手动布局的方式非常复杂&#xff0c;而且不精确无法对窗口大小进行自适应 因此Qt引入布局管理器来解决…

缓存Mybatis一级缓存与二级缓存

缓存 为什么使用缓存 缓存(cache)的作用是为了减去数据库的压力,提高查询性能,缓存实现原理是从数据库中查询出来的对象在使用完后不销毁,而是存储在内存(缓存)中,当再次需要获取对象时,直接从内存(缓存)中提取,不再向数据库执行select语句,从而减少了对数据库的查询次数,因此…

无法启动此程序,因为计算机中丢失dll,整理了7种解决方法!

当电脑出现“无法启动此程序&#xff0c;因为计算机中丢失dll”的错误弹窗时&#xff0c;这通常意味着系统中的DLL文件出现了缺失或错误。DLL文件是动态链接库文件&#xff0c;它们在软件运行中起着至关重要的作用。 造成dll文件缺失和错误的原因有很多&#xff0c;大部分问题都…