4.设计模式-FACTORY METHOD(工厂方法)

一、模式定义与核心价值

工厂模式(Factory Pattern) 是一种创建型设计模式,用于将对象创建逻辑与使用逻辑解耦。其核心价值在于:

  1. 封装变化:隔离对象创建过程的复杂性(如条件判断、初始化参数)
  2. 统一入口:通过工厂类集中管理对象的生命周期
  3. 扩展性提升:新增产品类型时无需修改客户端代码

模式变体

  • 简单工厂模式:单一工厂类通过条件判断创建不同对象
  • 工厂方法模式:定义抽象工厂接口,子类决定实例化哪个类

二、模式组成与UML图示

核心角色

  1. Product(抽象产品)
    • 定义产品的接口(如DatabaseConnection
  1. ConcreteProduct(具体产品)
    • 实现抽象产品接口的具体类(如MySQLConnection
  1. Factory(工厂)
    • 负责创建产品对象的入口类

UML类图

classDiagram
    class Database {
        <<interface>>
        +connect(): void
    }

    class MySQL {
        +connect()
    }

    class PostgreSQL {
        +connect()
    }

    class DatabaseFactory {
        <<interface>>
        +createDatabase(): Database
    }

    class MySQLFactory {
        +createDatabase()
    }

    class PostgreSQLFactory {
        +createDatabase()
    }

    Database <|-- MySQL
    Database <|-- PostgreSQL
    DatabaseFactory <|-- MySQLFactory
    DatabaseFactory <|-- PostgreSQLFactory


三、代码实现示例

场景描述:实现跨数据库连接的工厂体系

  1. 定义产品接口
public interface Database {
    void connect();
    void executeQuery(String sql);
}
  1. 实现具体产品
public class MySQLDatabase implements Database {
    @Override
    public void connect() {
        System.out.println("MySQL connected on port 3306");
    }

    @Override
    public void executeQuery(String sql) {
        System.out.println("Executing MySQL query: " + sql);
    }
}

public class PostgreSQLDatabase implements Database {
    @Override
    public void connect() {
        System.out.println("PostgreSQL connected on port 5432");
    }

    // 类似实现其他方法...
}
  1. 构建工厂体系
public interface DatabaseFactory {
    Database createDatabase();
    Database createDatabaseWithConfig(Map<String, String> config);
}

public class MySQLFactory implements DatabaseFactory {
    @Override
    public Database createDatabase() {
        return new MySQLDatabase();
    }

    @Override
    public Database createDatabaseWithConfig(Map<String, String> config) {
        MySQLDatabase db = new MySQLDatabase();
        // 根据配置初始化连接参数
        return db;
    }
}

// PostgreSQL工厂类似实现...
  1. 客户端调用
public class Client {
    public static void main(String[] args) {
        DatabaseFactory factory = new MySQLFactory();
        Database db = factory.createDatabase();

        db.connect();
        db.executeQuery("SELECT * FROM users");
    }
}

四、工业级源码应用

  1. JDBC DriverManager
    • DriverManager.getConnection() 本质是简单工厂的实现
    • 根据URL自动识别并加载对应数据库驱动
Connection conn = DriverManager.getConnection(
    "jdbc:mysql://localhost:3306/mydb", 
    "user", 
    "pass"
);
  1. Java Collection Framework
    • Collections.unmodifiableList() 是工厂方法的典型应用
    • 生产不可修改的List视图对象
List<String> list = new ArrayList<>();
List<String> unmodifiable = Collections.unmodifiableList(list);
  1. Spring Framework
    • BeanFactoryApplicationContext 是工厂模式的扩展实现
    • 通过XML配置或注解管理Bean的创建
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
UserService service = context.getBean(UserService.class);
  1. Log4j2 LoggerContext
    • LoggerContext.getLogger() 使用工厂模式创建Logger实例
    • 根据名称缓存并复用Logger对象
Logger logger = LogManager.getLogger("com.example.App");

五、模式适用场景

  1. 对象创建过程复杂:需要多层初始化或依赖注入
  2. 需要统一创建入口:如配置中心管理数据源创建
  3. 支持多环境配置:开发环境与生产环境使用不同实现
  4. 对象池化管理:如数据库连接池的创建与回收

六、模式优劣分析

优势

  • 解耦对象创建:客户端无需关注实例化细节
  • 提升可维护性:修改创建逻辑只需调整工厂类
  • 支持开闭原则:新增产品类型无需修改已有代码

劣势

  • 类数量增加:每个产品需要对应工厂类
  • 抽象层次复杂:过度使用会导致系统复杂度上升

七、最佳实践建议

  1. 优先使用工厂方法:当产品类型可能扩展时
  2. 结合单例模式:对需要复用的对象进行池化管理
  3. 使用依赖注入框架:如Spring的@Bean注解简化工厂实现
  4. 防御性编程:工厂方法应对非法参数进行校验

通过合理应用工厂模式,可以有效提升系统的可维护性和扩展性。在复杂系统中,工厂模式常与抽象工厂、建造者等模式组合使用,形成灵活的对象创建体系。

posted @ 2025-04-12 10:37  雾里看花的少年  阅读(30)  评论(0)    收藏  举报