Java:工厂模式

Java:工厂模式 在 Java 编程中‌工厂类Factory Class‌ 是创建型设计模式的核心组成部分。它的核心思想是将对象的‌创建过程‌与‌使用过程‌分离通过专门的工厂类来负责实例化对象而不是在客户端代码中直接使用 new 关键字。这种设计模式旨在封装对象创建的复杂逻辑提高代码的可维护性、可扩展性和灵活性。1. 核心作用与价值‌解耦降低耦合度‌客户端不需要知道具体产品类的类名只需要知道工厂类和抽象产品接口。这减少了客户端与具体实现类之间的依赖。‌封装创建逻辑‌如果对象的创建过程非常复杂例如需要读取配置文件、进行复杂的初始化计算、或根据环境选择不同的实现工厂类可以将这些细节隐藏起来。‌统一管理与控制‌可以在工厂类中对对象的创建进行统一管理例如实现单例控制、对象池管理或日志记录。‌符合开闭原则针对工厂方法/抽象工厂‌当需要增加新产品时通常只需增加新的具体产品类和对应的工厂子类而无需修改现有的客户端代码或原有工厂逻辑。2. 工厂模式的三种主要形态根据抽象程度和实现方式的不同工厂模式主要分为以下三类A. 简单工厂模式 (Simple Factory Pattern)‌定义‌由一个具体的工厂类根据传入的参数决定创建哪一种产品对象。‌特点‌工厂类通常包含一个静态方法如 createProduct 或 getInstance。内部使用 if-else 或 switch-case 判断参数类型。‌优点‌结构简单客户端使用方便。‌缺点‌违背“开闭原则”。每增加一种新产品都需要修改工厂类的判断逻辑导致工厂类职责过重难以维护。‌适用场景‌产品种类较少且创建逻辑简单不经常变动的场景。B. 工厂方法模式 (Factory Method Pattern)‌定义‌定义一个创建对象的接口抽象工厂但让子类决定实例化哪一个类。工厂方法将实例化推迟到子类。‌特点‌不再有一个统一的工厂类处理所有产品而是为每种产品提供一个对应的具体工厂子类。客户端依赖于抽象工厂接口。‌优点‌完全符合“开闭原则”。增加新产品时只需新增一个具体产品类和一个具体工厂类无需修改现有代码。‌缺点‌类的数量成倍增加每个产品对应一个工厂增加了系统的复杂度。‌适用场景‌系统需要扩展新的产品类型且希望保持代码灵活性的场景。C. 抽象工厂模式 (Abstract Factory Pattern)‌定义‌提供一个创建一系列相关或相互依赖对象的接口而无需指定它们具体的类。‌特点‌关注的是“产品族”Product Family。例如一个工厂专门生产“现代风格”的沙发和椅子另一个工厂专门生产“古典风格”的沙发和椅子。‌优点‌确保客户端始终只使用同一个产品族中的对象保证产品之间的兼容性。‌缺点‌难以支持新种类的产品即难以扩展产品等级结构因为需要修改抽象工厂接口及其所有实现类。‌适用场景‌需要创建一组相关或依赖的对象且需要保证这些对象能一起工作时如跨平台 UI 组件库、数据库驱动切换等。3. 代码示例简单工厂模式以下是一个典型的简单工厂模式示例用于根据类型创建不同的形状对象// 1. 抽象产品接口interface Shape {void draw();}// 2. 具体产品类class Circle implements Shape {Overridepublic void draw() {System.out.println(绘制圆形);}}class Rectangle implements Shape {Overridepublic void draw() {System.out.println(绘制矩形);}}// 3. 工厂类class ShapeFactory {// 静态方法根据参数返回具体实例public static Shape getShape(String type) {if (type null) {return null;}if (CIRCLE.equalsIgnoreCase(type)) {return new Circle();} else if (RECTANGLE.equalsIgnoreCase(type)) {return new Rectangle();}return null;}}// 4. 客户端调用public class Client {public static void main(String[] args) {// 客户端无需知道 new Circle()只需通过工厂获取Shape shape ShapeFactory.getShape(CIRCLE);if (shape ! null) {shape.draw(); // 输出: 绘制圆形}}}4. 何时使用工厂类‌对象创建逻辑复杂‌当对象的初始化需要大量步骤、依赖其他服务或配置时。‌需要隐藏实现细节‌当希望调用者只关心接口而不关心具体是哪个类被实例化时。‌系统需要高扩展性‌特别是在使用工厂方法或抽象工厂时便于后续添加新功能而不影响旧代码。‌框架与中间件开发‌如 JDBC 数据库连接、日志框架Log4j/SLF4J、Spring 容器中的 Bean 创建等广泛使用了工厂模式。5. 注意事项‌不要滥用‌如果对象创建非常简单仅通过 new 即可且没有复杂的逻辑或扩展需求直接实例化更简单直观引入工厂模式反而会增加不必要的复杂度。‌简单工厂的局限‌在实际大型项目中简单工厂因违背开闭原则常被视为一种编程习惯而非严格的设计模式。若预期未来会有较多产品扩展建议优先考虑‌工厂方法模式‌。