
示例工程教程【免费下载链接】java-design-patternsDesign patterns implemented in Java项目地址https://gitcode.com/GitHub_Trending/ja/java-design-patterns点击查看免费下载抽象工厂Abstract Factory是 GoF 创建型设计模式家族中的核心成员其本质是为创建一族相关或相互依赖的对象提供一个接口而无需指定它们的具体类。本文以 java-design-patterns 仓库中的abstract-factory模块阿拉伯语版文档位于 localization/ar/abstract-factory/README.md英文原版见 abstract-factory/README.md为主体展开讲解读者将掌握抽象工厂的完整结构、王国Kingdom实战示例的源码级实现、适用场景、取舍权衡以及如何通过仓库内单元测试验证模式的正确性。别名与核心意图该模式在业界也被称为Kit。其核心意图是为创建一族相关或相互依赖的对象提供一个接口而无需指定它们的具体类。用更通俗的话说抽象工厂是工厂的工厂——它将多个独立但彼此关联/依赖的具体工厂ElfKingdomFactory、OrcKingdomFactory聚合在一个统一接口之下客户端只面向抽象接口编程完全不感知也不关心最终拿到的是哪个具体实现类。维基百科对它的定义是抽象工厂模式提供了一种封装一组具有共同主题的独立工厂的方法而不指定它们的具体类。现实世界示例王国需要成套的对象要理解抽象工厂最直观的例子是创建一座王国。一个王国需要具有统一主题的一组对象精灵王国elven kingdom需要精灵国王、精灵城堡和精灵军队兽人王国orcish kingdom需要兽人国王、兽人城堡和兽人军队。这些对象之间存在强依赖——不能把精灵国王塞进兽人城堡里主题必须保持一致。这正是抽象工厂的用武之地客户端通过一个工厂接口一次性获取成套且主题统一的产品对象无需关心这些对象各自是如何被实例化的。换个行业类比一家家具公司用抽象工厂生产多种风格现代、维多利亚、乡村的家具每种风格包含椅子、桌子、沙发客户端可以一键创建整套现代家具或整套维多利亚家具风格一致且可整体切换。程序化示例从产品接口到工厂实现翻译上面的王国示例。首先定义王国中的三类产品接口与精灵族的具体实现public interface Castle { String getDescription(); } public interface King { String getDescription(); } public interface Army { String getDescription(); } // Elven implementations - 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; } } // Orcish implementations 与此类似描述文本为 This is the orc ...在仓库中上述接口分别对应 Castle.java、King.java、Army.java精灵族实现为 ElfCastle.java、ElfKing.java、ElfArmy.java兽人族实现为 OrcCastle.java、OrcKing.java、OrcArmy.java。接下来是王国工厂的抽象与具体实现。KingdomFactory是抽象工厂接口定义了一组产品创建方法ElfKingdomFactory与OrcKingdomFactory分别负责组装精灵套件和兽人套件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(); } } public class OrcKingdomFactory implements KingdomFactory { Override public Castle createCastle() { return new OrcCastle(); } Override public King createKing() { return new OrcKing(); } Override public Army createArmy() { return new OrcArmy(); } }对应源码KingdomFactory.java、ElfKingdomFactory.java、OrcKingdomFactory.java。注意每个工厂方法的返回类型都是接口类型Castle、King、Army具体产品类型被完全隐藏。FactoryMaker工厂的工厂现在我们可以为不同的王国工厂设计一个工厂选择器。仓库示例中创建了FactoryMaker它负责返回ElfKingdomFactory或OrcKingdomFactory的实例。客户端通过FactoryMaker获得所需的具体工厂再由该工厂产出具体的产品对象Army、King、Castle的派生类。示例还使用了enum参数化客户端想要请求的王国工厂类型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(); default - throw new IllegalArgumentException(KingdomType not supported.); }; } }在仓库中FactoryMaker以静态内部类的形式定义于 Kingdom.java其makeFactory方法使用 Java 12 的switch表达式语法按枚举值映射到对应具体工厂。这种写法既保证了可扩展性新增王国类型只需增加枚举值和 case 分支也把选哪个工厂的决策逻辑集中在一处。客户端入口App 主程序仓库中 App.java 演示了完整的客户端用法。createKingdom方法接收Kingdom.FactoryMaker.KingdomType枚举通过FactoryMaker.makeFactory取得工厂再依次调用createKing()、createCastle()、createArmy()把三种产品装配进Kingdom聚合对象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());程序输出日志格式因运行环境略有差异字段含义一致elf kingdom This is the elven army! This is the elven castle! This is the elven king! orc kingdom This is the orc army! This is the orc castle! This is the orc king!可以看到客户端全程只面向KingdomFactory与产品接口编程切换精灵王国/兽人王国只需改变传入的枚举值代码零改动。类图抽象工厂在该模块中的角色结构与调用关系如下图所示抽象工厂类图从类图PlantUML 源文件位于 abstract-factory.urm.puml可以清晰看到三条层次产品接口Castle/King/Army与各自的具体实现抽象工厂接口KingdomFactory与两个具体工厂以及Kingdom.FactoryMaker作为客户端与具体工厂之间的选择器。适用场景何时使用抽象工厂根据文档当以下情况出现时应当考虑抽象工厂模式系统需要独立于其产品的创建、组合与表示方式系统需要被配置为使用多个产品族中的某一个一族相关产品对象必须被一起使用且需要强制这种一致性约束希望提供产品类库只对外暴露接口而不暴露实现依赖的生命周期短于使用方consumer的生命周期依赖需要通过运行时值或参数来构造需要在运行时决定使用产品族中的哪一个产品需要在运行时已知一个或多个参数之后才能解析依赖需要保证产品之间的一致性希望新增产品族或新产品时不必修改已有代码。典型用例包括在运行时选择合适的服务实现例如在FileSystemAcmeService、DatabaseAcmeService、NetworkAcmeService之间切换编写单元测试时用抽象工厂轻松替换为测试替身stub/mock大幅降低测试复杂度为不同操作系统OS的 UI 工具提供各自的产品族实现类似 Java Swing 的LookAndFeel机制。后果与权衡抽象工厂带来的主要收益灵活性Flexibility无需修改客户端代码即可在产品族之间轻松切换解耦Decoupling客户端只与抽象接口交互提升了可移植性与可维护性可复用性Reusability抽象工厂与产品便于跨项目复用组件可维护性Maintainability单个产品族的修改被局部化更新成本低。同时也要正视它的代价隐藏依赖注入可能引入运行时错误在 Java 中把依赖注入隐藏进服务对象内部可能导致原本可以在编译期捕获的问题推迟到运行时才暴露扩展新产品困难模式擅长创建预先定义好的对象但要新增一种产品如给王国加一个顾问时需要同步修改抽象工厂接口与所有具体工厂改动面较大代码复杂度上升随着大量新接口、新类的引入代码会比简单直接实现更复杂需要评估是否值得。已知的实际应用抽象工厂在 Java 标准库中有多处经典应用文档明确列出的包括javax.xml.parsers.DocumentBuilderFactory——获取解析 XML 文档的DocumentBuilderjavax.xml.transform.TransformerFactory——创建 XSLT 转换器javax.xml.xpath.XPathFactory——创建 XPath 求值器。此外Java Swing 的LookAndFeel类族、Java AWT 中用于创建不同 GUI 组件的各实现都是抽象工厂思想在生产环境中的真实落地。与相关模式的关系工厂方法Factory Method抽象工厂通常借助工厂方法来实现产品创建——每个createXxx()本质上就是一个工厂方法工厂套件Factory Kit与抽象工厂相似但更侧重于以灵活方式配置和管理一组相关对象单例Singleton抽象工厂的具体工厂类常被实现为单例避免重复创建工厂实例带来的开销。仓库源码与测试验证本模块的完整实现与测试均可直接查阅产品接口与实现abstract-factory/src/main/java/com/iluwatar/abstractfactory/下的Castle/King/Army及Elf*、Orc*系列类工厂抽象与实现KingdomFactory.java、ElfKingdomFactory.java、OrcKingdomFactory.java聚合对象与工厂选择器Kingdom.java程序入口App.java。单元测试 AbstractFactoryTest.java 从产品一致性角度验证了模式的正确性对ELF枚举调用createKingdom后断言king/castle/army均为Elf*类型且描述文本匹配ElfKing.DESCRIPTION等常量对ORC同理。这恰好印证了抽象工厂的核心承诺——产品族内部一致性由工厂保证客户端无需也无法混用不同产品族。运行方式该模块是一个标准的 Maven 子模块见 abstract-factory/pom.xml主类为com.iluwatar.abstractfactory.App可在仓库根目录执行./mvnw -pl abstract-factory test运行测试或使用maven-assembly-plugin打包后直接运行App查看日志输出。小结抽象工厂模式通过接口工厂 成套产品的组合把对象创建与具体类解耦让客户端能够以统一方式、零修改地切换整族产品。java-design-patterns 仓库的王国示例结构清晰、可运行可测试是学习该模式的最佳参考实现理解KingdomFactory、Elf/OrcKingdomFactory与FactoryMaker三者之间的协作关系也就掌握了抽象工厂的全部要点。赞分享示例工程教程【免费下载链接】java-design-patternsDesign patterns implemented in Java项目地址https://gitcode.com/GitHub_Trending/ja/java-design-patterns点击查看免费下载相关推荐java-design-patterns 仓库实战深入理解 Java 抽象工厂模式Abstract Factoryjava design patterns 仓库实战深入理解 Java 抽象工厂模式Abstract Factory 抽象工厂Abstract Facto示例工程教程Java 设计模式之工厂模式Factory Pattern实战指南以 java-design-patterns 仓库的铸币工厂为例Java 设计模式之工厂模式Factory Pattern实战指南以 java design patterns 仓库的铸币工厂为例 工厂模式Factor示例工程教程Factory Kit 工厂套件模式实战解析用 java-design-patterns 仓库打造可配置的对象工厂Factory Kit 工厂套件模式实战解析用 java design patterns 仓库打造可配置的对象工厂 Factory Kit工厂套件是一种创示例工程教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考