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

news2024/11/17 13:33:09

文章目录

    • 一、概述
    • 三、抽象工厂设计模式的意图
    • 四、抽象工厂模式的详细解释及实际示例
    • 五、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!";
    @Override
    public String getDescription() {
        return DESCRIPTION;
    }
}
public class ElfKing implements King {
    static final String DESCRIPTION = "This is the elven king!";
    @Override
    public String getDescription() {
        return DESCRIPTION;
    }
}
public class ElfArmy implements Army {
    static final String DESCRIPTION = "This is the elven Army!";
    @Override
    public String getDescription() {
        return DESCRIPTION;
    }
}
// 兽人实现类似...
  1. 然后,我们为王国工厂定义抽象和实现。
public interface KingdomFactory {
    Castle createCastle();
    King createKing();
    Army createArmy();
}
public class ElfKingdomFactory implements KingdomFactory {
    @Override
    public Castle createCastle() {
        return new ElfCastle();
    }
    @Override
    public King createKing() {
        return new ElfKing();
    }
    @Override
    public 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.coloradmin.cn/o/2076001.html

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

相关文章

Python中的random模块及相关模块详解例子2解析

Python 的 random 模块提供了生成随机数的函数,这些函数可以用于各种场景,如模拟、游戏开发、加密等。以下是 random 模块的一些常用功能和示例。 基本函数 random.seed(aNone, /) - 初始化随机数生成器。如果提供相同的种子值,将生成相同的…

elastic-job定时任务

静态任务案例 ​ 使用elastic-job很容易,我们接下来学习下elastic-job的使用,这里的案例我们先实现静态任务案例,静态任务案例也就是执行时间事先写好。 实现步骤: 1.引入依赖包 2.配置zookeeper节点以及任务名称命名空间 3.实…

数据分析:锚定黄金营销节点,【出行+文化】成小红书大势

导语 据悉,小红书发布《十大搜索趋势洞察》,小编发现其中涉及到热门趋势【理性听劝】。本期,小编将以此展开,为即将到来的十一长假,为品牌提供营销启示。 洞察【出行文化】这件大事 在出行这件事上,小红…

FuTalk设计周刊-Vol.071

#AI漫谈 热点捕手 1.Midjourney 网页版开放,提供了免费的使用额度 链接https://x.com/midjourney/status/1826305298560418171 2.Stability AI推出Stable Video 4D模型 Stability AI最新推出Stable Video 4D模型,支持多视角生成、4D模型生成等能力。S…

【网络】传输层协议——TCP协议(进阶)

目录 1.TCP连接的11种状态 2.再次理解三次挥手 2.1.再次理解三次握手 2.2.Socket编程和三次握手的关系 2.2.1.listen的参数 2.2.2.accept函数 2.3.TCP三次握手的优点 2.3.1.阻止重复历史连接的初始化 2.3.2.为什么两次握手不能防止旧的重复连接初始化造成混乱呢&am…

Java开发笔记-spring的@schedule低级错误

最近在追一个数据库等待锁超时,数据库死锁导致的数据问题。考虑是定时任务占用锁,触发器sql冲突导致。于是在研究程序日志。发现了另外一个问题:我的定时任务明明注解的 每天七点执行,他偏偏9点才执行。 之前也没去管它&#xff0…

三维扫描建模是什么?有什么优势?适用于哪些场景?

扫描建模是指通过专业的三维扫描仪对产品进行三维数据的采集,快速获取物体精确的3D数据,实现1:1复刻原物体,扫描后所得的数字化3D模型以obj、fbx、glb、gltf等格式保存。 积木易搭自主研发多款三维扫描设备,通过非接触式扫描硬件设…

ant-design-vue@1在线主题编辑器实现

::: tip 本文介绍工作中碰到的需求,需要基于vue2、ant-design-vue1版本和less实现使用了ant-design-vue组件库的项目在线配置主题。其中核心就是html支持直接引入stylesheet/less,可以使用less.modifyVars修改变量动态编译。 ::: 项目依赖 ant-design-…

DevOps实现CI/CD实战(二)-Jenkins配置

六、 CI/CD入门操作 基于Jenkins拉取GitLab的SpringBoot代码进行构建发布到测试环境实现持续集成 基于Jenkins拉取GitLab指定发行版本的SpringBoot代码进行构建发布到生产环境实现CD实现持续部署 1. 创建springboot项目 编写简单的程序 修改pom.xml,添加打包的…

论文学习—Efficient Multi-label Classification with Many Labels

论文学习:Efficient Multi-label Classification with Many Labels 摘要2. 多标签分类相关工作2.1 Label Transformation1. **降维(Dimensionality Reduction)**2. **回归模型(Regression Model)**3. **逆变换&#xf…

深圳MES制造管理系统在企业中的应用

深圳是中国制造业的重要基地,许多制造企业在深圳地区都在使用MES制造管理系统来优化生产管理、提高生产效率和产品质量。深圳MES制造管理系统的应用主要体现在以下几个方面: 生产计划管理:深圳的制造企业通常面临订单量大、交货期紧的情况&am…

nginx + lnmp架构部署

一、nginx简介 Nginx是一款轻量级的Web服务器/反向代理服务器及电子(IMAP/POP3)代理服务器。 Nginx由俄罗斯的程序设计师Igor Sysoev所开发,最初供俄国大型的入口网站及搜寻引擎Rambler使用。 第一个公开版本0.1.0发布于2004年10月4日。其…

一文彻底搞懂CNN - 2012年ImageNet大赛冠军(AlexNet)

AlexNet是一种深度卷积神经网络(CNN),由Alex Krizhevsky、Ilya Sutskever和Geoffrey Hinton于2012年在ImageNet图像分类竞赛中首次引入。AlexNet是第一个在ImageNet数据集上取得最佳结果的深度学习模型,它的出现标志着深度学习在图…

如何构建KPL比赛在线售票系统——Java SpringBoot与Vue的完美结合

🎓 作者:计算机毕设小月哥 | 软件开发专家 🖥️ 简介:8年计算机软件程序开发经验。精通Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等技术栈。 🛠️ 专业服务 🛠️ 需求定制化开发源码提…

A 股业绩报表数据 API 数据接口

A 股业绩报表数据 API 数据接口 股票 / A股 A 股上市公司季度业绩报表数据 全量数据 / 业绩报表。 1. 产品功能 提供 A 股上市公司季度业绩报表数据;支持按年份、季度和股票代码查询;包含每股收益、营业收入、净利润等关键财务指标;提供同比…

AI成身高真相探测器,误差仅2厘米,网恋对象无处遁形

“ 你是否想过,AI能成为你相亲时的身高测量师呢? ” 在约会软件上,相亲对象谎报身高的现象并不罕见。但随着AI技术的进步,这一“古老”的问题似乎找到了解决之道。 “我的眼睛就是尺” 如今AI模型被发现能够准确估计照片中人物…

搭子小程序开发,小程序功能特点

在当下网络时代中,年轻人的社交方式多种多样,搭子作为一个热门社交方式,深受年轻人的欢迎!不管是健身、旅游、学习等,都可以找到相投的搭子!这种社交方式帮助年轻人快速建立社交圈,打造广泛的人…

【数据集】SAR飞机数据集用于目标检测

SAR-AIRcraft-1.0数据集分享 后附下载链接 原文链接: https://radars.ac.cn/cn/article/doi/10.12000/JR23043 类别:A220, A320/321, A330, ARJ21, Boeing737, Boeing787, other 数据来源:GF-3,单极化 成像地区:上海…

奔驰S迈巴赫S480升级动态按摩座椅效果怎么样

在迈巴赫 S480 的尊崇之旅中,舒适从未有尽头。现在,为您呈现前排动态按摩座椅的升级,将舒适体验提升至全新境界。 迈巴赫 S480 已然是舒适的代名词,但前排动态按摩座椅的升级,将为您带来前所未有的放松与享受。 当您…

【JVM】OOM与调优(一)

OOM与调优 方法区 import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy;import java.lang.reflect.Method;public class MetaspaceOverFlowTest {/*** 模拟CGLIB向元空间写入数据*/public static void …