4.设计模式-FACTORY METHOD(工厂方法)
一、模式定义与核心价值
工厂模式(Factory Pattern) 是一种创建型设计模式,用于将对象创建逻辑与使用逻辑解耦。其核心价值在于:
- 封装变化:隔离对象创建过程的复杂性(如条件判断、初始化参数)
- 统一入口:通过工厂类集中管理对象的生命周期
- 扩展性提升:新增产品类型时无需修改客户端代码
模式变体:
- 简单工厂模式:单一工厂类通过条件判断创建不同对象
- 工厂方法模式:定义抽象工厂接口,子类决定实例化哪个类
二、模式组成与UML图示
核心角色:
- Product(抽象产品)
-
- 定义产品的接口(如
DatabaseConnection)
- 定义产品的接口(如
- ConcreteProduct(具体产品)
-
- 实现抽象产品接口的具体类(如
MySQLConnection)
- 实现抽象产品接口的具体类(如
- 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

三、代码实现示例
场景描述:实现跨数据库连接的工厂体系
- 定义产品接口
public interface Database {
void connect();
void executeQuery(String sql);
}
- 实现具体产品
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");
}
// 类似实现其他方法...
}
- 构建工厂体系
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工厂类似实现...
- 客户端调用
public class Client {
public static void main(String[] args) {
DatabaseFactory factory = new MySQLFactory();
Database db = factory.createDatabase();
db.connect();
db.executeQuery("SELECT * FROM users");
}
}
四、工业级源码应用
- JDBC DriverManager
-
DriverManager.getConnection()本质是简单工厂的实现- 根据URL自动识别并加载对应数据库驱动
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/mydb",
"user",
"pass"
);
- Java Collection Framework
-
Collections.unmodifiableList()是工厂方法的典型应用- 生产不可修改的List视图对象
List<String> list = new ArrayList<>();
List<String> unmodifiable = Collections.unmodifiableList(list);
- Spring Framework
-
BeanFactory和ApplicationContext是工厂模式的扩展实现- 通过XML配置或注解管理Bean的创建
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
UserService service = context.getBean(UserService.class);
- Log4j2 LoggerContext
-
LoggerContext.getLogger()使用工厂模式创建Logger实例- 根据名称缓存并复用Logger对象
Logger logger = LogManager.getLogger("com.example.App");
五、模式适用场景
- 对象创建过程复杂:需要多层初始化或依赖注入
- 需要统一创建入口:如配置中心管理数据源创建
- 支持多环境配置:开发环境与生产环境使用不同实现
- 对象池化管理:如数据库连接池的创建与回收
六、模式优劣分析
优势:
- 解耦对象创建:客户端无需关注实例化细节
- 提升可维护性:修改创建逻辑只需调整工厂类
- 支持开闭原则:新增产品类型无需修改已有代码
劣势:
- 类数量增加:每个产品需要对应工厂类
- 抽象层次复杂:过度使用会导致系统复杂度上升
七、最佳实践建议
- 优先使用工厂方法:当产品类型可能扩展时
- 结合单例模式:对需要复用的对象进行池化管理
- 使用依赖注入框架:如Spring的
@Bean注解简化工厂实现 - 防御性编程:工厂方法应对非法参数进行校验
通过合理应用工厂模式,可以有效提升系统的可维护性和扩展性。在复杂系统中,工厂模式常与抽象工厂、建造者等模式组合使用,形成灵活的对象创建体系。

浙公网安备 33010602011771号