Java 简单工厂模式(Simple Factory Pattern)实战指南:以 java-design-patterns 的 CoinFactory 为例 示例工程教程【免费下载链接】java-design-patternsDesign patterns implemented in Java项目地址https://gitcode.com/GitHub_Trending/ja/java-design-patterns点击查看免费下载导读本文围绕 java-design-patterns 仓库中 factory 模块 的完整实现系统讲解简单工厂模式Simple Factory也称静态工厂方法 Static Factory Method的核心思想、UML 结构与源码实现。你将掌握如何用一个封装了静态工厂方法的类隐藏对象创建逻辑让客户端只关心用什么而不关心怎么造并理解它与 Factory Method、Abstract Factory、Factory Kit 等创建型模式的边界。一、模式概览它是什么为什么需要它简单工厂模式属于创建型模式Creational Pattern中的一种分类标签为 Gang of Four 相关模式。其核心做法是将对象创建的实现逻辑封装在名为 factory 的类中向客户端暴露一个静态方法。客户端调用该方法时只需传入类型参数即可获得对应实例从而把注意力从初始化新对象转移到使用对象上。在 localization/ko/factory/README.md本文的韩文关联文档与 factory/README.md英文主文档中官方给出的意图如下提供封装在 factory 类中的静态方法隐藏实现逻辑使客户端代码专注于对象的使用而非初始化。Wikipedia 对 factory 的定义同样简洁Factory 是用于创建其他对象的对象。正式地说factory 是返回可变原型或类对象的函数或方法。现实场景举例一个 SQLServer 连接的 Web 应用需要切换到 Oracle且不想修改既有源代码。此时可以引入 Simple Factory通过静态方法为给定数据库创建连接对象客户端无需感知数据库驱动差异。这一场景揭示了简单工厂最典型的价值把创建什么、如何创建的决策集中到一处当需求变化如切换数据库、新增产品类型时只改动工厂内部客户端代码保持稳定。二、源码级实现CoinFactory 炼金术士造币示例factory 模块用炼金术士铸造金币/铜币作为示例完整代码位于 factory/src/main/java/com/iluwatar/factory 目录下共包含 6 个类文件角色类文件路径抽象产品Coin接口Coin.java具体产品GoldCoin、CopperCoinGoldCoin.java、CopperCoin.java产品类型枚举CoinTypeCoinType.java工厂类CoinFactoryCoinFactory.java客户端入口AppApp.java1. 抽象产品Coin接口public interface Coin { String getDescription(); }抽象产品定义了所有具体产品必须实现的行为契约。这里只有一个getDescription()方法用于返回对产品类型的文字描述。2. 具体产品GoldCoin与CopperCoinpublic class GoldCoin implements Coin { static final String DESCRIPTION This is a gold coin.; Override public String getDescription() { return DESCRIPTION; } }public class CopperCoin implements Coin { static final String DESCRIPTION This is a copper coin.; Override public String getDescription() { return DESCRIPTION; } }两个具体产品都实现了Coin接口各自维护一个DESCRIPTION常量。从源码结构可以推断后续若需新增产品如银币SilverCoin只需新增一个实现Coin的类并在枚举中注册无需触碰现有类——这正是简单工厂在开闭原则上的贡献。3. 产品类型枚举CoinTypeRequiredArgsConstructor Getter public enum CoinType { COPPER(CopperCoin::new), GOLD(GoldCoin::new); private final SupplierCoin constructor; }CoinType是简单工厂的类型注册表。它利用 Java 8 的SupplierCoin函数式接口将构造函数引用CopperCoin::new、GoldCoin::new存储为枚举常量字段。配合 Lombok 的RequiredArgsConstructor生成接收SupplierCoin的构造器与Getter生成getConstructor()访问器枚举本身就成为了一张类型 → 构造器的映射表。4. 工厂类CoinFactorypublic class CoinFactory { /** Factory method takes as a parameter the coin type and calls the appropriate class. */ public static Coin getCoin(CoinType type) { return type.getConstructor().get(); } }CoinFactory是简单工厂的核心。它只暴露一个静态方法getCoin(CoinType type)方法体内没有任何 if-else 分支通过type.getConstructor().get()直接委托给CoinType枚举持有的Supplier完成实例化。这种枚举驱动的实现比传统 if-else 版本更简洁、更易扩展——新增币种时枚举与产品类成对添加即可。5. 客户端入口AppSlf4j public class App { /** Program main entry point. */ public static void main(String[] args) { LOGGER.info(The alchemist begins his work.); var coin1 CoinFactory.getCoin(CoinType.COPPER); var coin2 CoinFactory.getCoin(CoinType.GOLD); LOGGER.info(coin1.getDescription()); LOGGER.info(coin2.getDescription()); } }客户端只做了两件事调用静态工厂方法拿到实例然后使用实例。整个代码中不出现new Coin(...)之类的直接实例化对象的创建完全被隔离在工厂层。程序运行输出06:19:53.530 [main] INFO com.iluwatar.factory.App -- The alchemist begins his work. 06:19:53.533 [main] INFO com.iluwatar.factory.App -- This is a copper coin. 06:19:53.533 [main] INFO com.iluwatar.factory.App -- This is a gold coin.注韩文关联文档中使用的示例为CarFord/Ferrari与CarsFactory代码结构与本仓库Coin/CoinFactory完全同构本文以仓库实际源码为准展开讲解。三、UML 类图与调用时序factory 模块的 etc 目录下提供了两张官方示意图准确刻画了简单工厂的结构与交互。类图五种角色的静态关系类图清晰展示了简单工厂的完整角色结构抽象产品Coin接口位于顶层GoldCoin、CopperCoin分别实现它CoinType枚举记录了类型与构造器的映射CoinFactory作为工厂负责生产App作为调用端完成整个工厂调用流程。这张图直接对应了 factory.urm.puml 源文件。时序图客户端与工厂的交互流程时序图还原了简单工厂的运行逻辑客户端Client向工厂Factory发起创建产品请求工厂依据类型调用对应产品的实例化方法最后将实例返回给客户端。整个过程中客户端只与工厂交互完全感知不到具体产品的构造细节。四、测试验证工厂行为如何被保障factory 模块自带两个 JUnit 5 测试用于验证工厂的核心行为CoinFactoryTest—— CoinFactoryTest.javaclass CoinFactoryTest { Test void shouldReturnGoldCoinInstance() { final var goldCoin CoinFactory.getCoin(CoinType.GOLD); assertTrue(goldCoin instanceof GoldCoin); } }该测试断言CoinFactory.getCoin(CoinType.GOLD)返回的实例确实是GoldCoin类型直接验证了工厂根据枚举类型返回正确具体产品这一核心职责。AppTest—— AppTest.javaclass AppTest { Test void shouldExecuteWithoutExceptions() { assertDoesNotThrow(() - App.main(new String[] {})); } }该测试验证App.main的完整调用链含工厂调用与日志输出能无异常执行保证示例程序的端到端可用性。五、适用场景与使用建议根据官方文档当以下情况出现时适合使用简单工厂类事先不知道它需要创建的对象的确切类型和依赖一个方法需要返回共享同一父类/接口的多个可能类之一且希望封装创建哪个对象的决策逻辑在设计框架或类库时希望获得对具体类类型的最佳灵活性与隔离性。结合源码进一步解读集中创建逻辑所有对象创建集中在一处CoinFactory避免代码库中散落new关键字从源码结构看factory/src/main/java下唯一的实例化入口就是工厂方法内部的Supplier.get()。松散耦合客户端仅依赖Coin抽象与CoinType枚举不依赖GoldCoin/CopperCoin具体类因此更利于测试可注入 mock 产品、组件替换与功能扩展。六、优点与代价优点创建集中管理所有对象创建保持在一处防止new关键字在代码库中蔓延降低耦合写出松散耦合的代码带来更好的可测试性、更易读的代码、可替换的组件、可扩展性与功能隔离符合开闭原则系统可在不修改现有代码的前提下引入新类型新增产品类 枚举注册即可。代价代码复杂度上升引入多个附加类抽象产品、具体产品、枚举、工厂后代码比直接实例化复杂可能过度设计如果对象创建本身逻辑简单、复杂度低过度使用会降低代码可读性。韩文文档对此的表述是代码比想象中更复杂。七、相关模式辨析简单工厂常与以下模式对照使用模式关系说明仓库模块Factory Method工厂方法更正统的 GoF 模式通过子类重写工厂方法决定实例化哪个类简单工厂可视为其特例或简化版factory-methodFactory Kit工厂套件一种将 builder 与 factory 接口分离的不可变内容工厂比简单工厂更灵活factory-kitAbstract Factory抽象工厂可看作工作在一组产品之上的工厂用于创建相互关联的产品族abstract-factorySingleton单例常与工厂搭配使用确保某个类只有一个实例singletonBuilder建造者将复杂对象的构造与其表示分离与工厂管理实例化的思路互补builder八、如何在本地运行与验证factory 是 Maven 多模块项目中的一个独立子模块见 factory/pom.xml仓库根目录提供了 Maven Wrappermvnw。在仓库根目录执行以下命令即可编译、运行测试并查看示例输出# 编译并运行 factory 模块的全部测试CoinFactoryTest、AppTest ./mvnw -pl factory test # 若需直接运行 App 主类查看程序输出 ./mvnw -pl factory exec:java -Dexec.mainClasscom.iluwatar.factory.App提示mvnw为 Maven Wrapper 脚本无需预先安装 Maven执行测试可观察CoinFactoryTest对CoinType.GOLD → GoldCoin的断言通过。结语简单工厂是创建型模式中最小巧、最易上手的一种。本仓库的 factory 模块用炼金术士造币这个不足百行的例子展示了从抽象产品、具体产品、类型枚举到静态工厂方法的完整套路枚举 Supplier的写法更是消除了传统 if-else 分支让扩展新币种变成加一个类、加一个枚举常量两件事。掌握它之后再对比 factory-method、factory-kit 与 abstract-factory 模块你就能建立起对创建型模式家族的整体认知。赞分享示例工程教程【免费下载链接】java-design-patternsDesign patterns implemented in Java项目地址https://gitcode.com/GitHub_Trending/ja/java-design-patterns点击查看免费下载相关推荐Java 设计模式之工厂模式Factory Pattern实战指南以 java-design-patterns 仓库的铸币工厂为例Java 设计模式之工厂模式Factory Pattern实战指南以 java design patterns 仓库的铸币工厂为例 工厂模式Factor示例工程教程Java 设计模式工厂模式Factory Pattern在 java-design-patterns 中的实现与实战Java 设计模式工厂模式Factory Pattern在 java design patterns 中的实现与实战 工厂模式Factory Patte示例工程教程抽象工厂模式Abstract FactoryJava 实战解析以 java-design-patterns 仓库的王国示例为例抽象工厂模式Abstract FactoryJava 实战解析以 java design patterns 仓库的王国示例为例 导读 抽象工厂模式Abs示例工程教程上一篇dockview部署指南从开发到生产环境的完整流程下一篇Awesome-Computer-Vision-Paper-List的API开发指南构建个性化研究工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考