工厂模式核心是将对象创建逻辑从使用方抽离,由工厂类/方法统一管理;包括简单工厂(静态方法封装)、工厂方法(子类定制创建)、抽象工厂(创建关联对象族)及与builder组合处理复杂构造。

工厂模式在 Java 中创建复杂对象的核心是把对象的创建逻辑从使用方抽离出来,由专门的工厂类或方法负责。它不直接 new 对象,而是通过统一接口获取实例,尤其适合对象构造步骤多、依赖多、配置差异大或需要隐藏具体实现的场景。
用简单工厂封装基础创建逻辑
简单工厂不是 GoF 23 种设计模式之一,但最易上手,适合轻量级解耦。它用一个静态方法根据参数返回不同子类实例。
例如,要创建不同类型的数据库连接(MySQL、PostgreSQL),可以定义:
- 一个公共接口 DatabaseConnection
- 多个实现类(MySQLConnection、PostgreSQLConnection)
- 一个 ConnectionFactory 类,含静态方法 create(String type)
调用方只需传入类型字符串,无需关心 new 哪个类、是否要设置 URL/用户名/密码等细节——这些都在工厂内部完成。
用工厂方法模式支持子类定制创建流程
当不同产品族需要各自独立的创建逻辑时,用工厂方法模式更合适。它把“创建对象”的责任延迟到子类,让每个子类决定实例化哪个具体类。
做法是:定义一个抽象工厂类(如 DocumentFactory),声明抽象方法 createDocument();再为 PDF、Word 等文档类型分别写子类(PdfDocumentFactory、WordDocumentFactory),各自实现该方法并返回对应文档对象。
这样新增文档类型时,只加新工厂子类,不修改原有代码,符合开闭原则。
用抽象工厂模式构建关联对象族
如果要创建的不是单个对象,而是一组有内在关联的对象(比如 UI 组件:Button + TextField + Dialog,在 Windows 和 macOS 下表现不同),就该用抽象工厂。
定义一个抽象工厂接口(如 GUIFactory),包含多个创建方法(createButton()、createTextField());再为每个平台实现该接口(WindowsFactory、MacFactory)。客户端只依赖抽象工厂接口,运行时注入具体工厂,就能获得整套风格一致的组件。
这种模式天然支持产品族扩展,也避免了客户端硬编码多个 new,降低耦合度。
结合 Builder 模式处理超长构造参数
当对象本身非常复杂(如 HTTP 请求对象含 URL、headers、body、timeout、retry 等十多个可选参数),单纯靠工厂可能让工厂方法签名臃肿或难以维护。这时可在工厂内部组合 Builder。
例如,HttpRequestFactory.createGet(String url) 内部先 new 一个 HttpRequest.Builder(),再链式设置默认 header、超时等,最后调用 build() 返回完整对象。工厂对外保持简洁接口,对内复用 Builder 的可读性和灵活性。
这种组合方式在实际项目中很常见,既保留工厂的统一入口优势,又规避了构造函数爆炸问题。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











