Java设计模式-工厂模式
关于Java的全部设计模式和分类,在单例模式中已有。
工厂模式
简介
定义创建对象的接口(工厂),让其子类决定实例化哪一个类。
场景
这里会举两个例子,一个自己举的例子,一些工厂模式的实际使用场景
创建汽车的例子
1.产品接口
首先定义一个产品的接口,比如以创建汽车的例子,例如有一个Car接口:
java
public interface Car {
void drive();
}
2.具体产品类
java
public class Sedan implements Car {
@Override
public void drive(){
System.out.println("轿车启动");
}
}
public class SUV implements Car {
@Override
public void drive(){
System.out.println("SUV启动");
}
}
3.工厂接口和具体工厂类
定义一个工厂接口CarFactory用于生产汽车:
java
public interface CarFactory{
Car produceCar();
}
然后有具体的类决定生产那种车:
java
public class SedanFactory implements CarFactory{
@Override
public Car produceCar(){
return new Sedan();
}
}
public class SUVFactory implements CarFactory {
@Override
public Car produceCar(){
return new SUV();
}
}
4.使用示例
java
public class Main{
public static void main(String[] args){
//使用轿车工厂生产轿车并启动
SedanFactory s = new SedanFactory();
Car sedun = s.produceCar();
sedun.drive();
//同理:请你写
}
}
在这个例子中,CarFactory就是创建对象的工厂接口,SedanFactory
和SUVFactory
是其子类,它们分别决定实例化Sedan
和SUV
类。这样如果要添加新类型的汽车,只需要创建新的汽车类和对应的工厂类,而不需要修改现在的代码,符合开闭原则。
然后就是关于工厂模式的实际应用
数据库连接池:
-
比如
HikariCP
、C3P0
、Druid
等常见的连接池实现,它们都会使用工厂模式来创建和配置数据库连接池对象。通常,连接池会暴露一个工厂类,通过工厂方法提供数据库连接对象,而用户不需要直接创建数据库连接对象,而是从连接池中获取。这种方式可以有效地管理数据库连接,避免每次请求都重新创建连接。例如,HikariCP(一个高性能的数据库连接池),在初始化时使用了类似工厂模式的设计:java复制代码HikariDataSource dataSource = new HikariDataSource(); dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/mydatabase"); dataSource.setUsername("user"); dataSource.setPassword("password");
在这个过程中,
HikariDataSource
实际上充当了工厂类,用户通过它来配置和获取数据库连接。
序列化与反序列化:
- 在一些框架中(如 JSON 或 XML 解析库),工厂模式用于根据配置创建不同类型的对象,或者根据数据格式(JSON、XML)动态选择适当的解析器。
日志框架:
- 在一些日志框架(如 Log4j 或 SLF4J)中,工厂模式用于根据配置生成不同类型的日志记录器对象。通常通过工厂方法来选择不同的日志级别、输出目的地等。
MyBatis中的应用
-
在 MyBatis 中,工厂模式也有应用,主要体现在数据库连接和会话管理的部分。
SqlSessionFactory :MyBatis 的核心工厂类之一就是
SqlSessionFactory
,它用于创建和管理SqlSession
对象。SqlSessionFactory
是一个典型的工厂模式实现。它通过读取 MyBatis 配置文件(如mybatis-config.xml
),根据配置信息来创建SqlSession
对象。例如,以下是 MyBatis 中创建
SqlSessionFactory
的方式:SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSessionFactory
的构建通常需要配置数据源、映射器等信息,它会根据这些配置生成SqlSession
实例,而用户则通过SqlSessionFactory
获取到SqlSession
,并通过它来执行数据库操作。这一过程的核心就是通过工厂模式动态创建和管理SqlSession
对象。
优点
就结合上面的例子,理解为什么要使用它,不使用就不行吗?
解耦对象创建和使用,在 MySQL 和 MyBatis 的数据库连接管理中及我举的例子中都有体现
符合开闭原则,使得扩展性很好
缺点
增加系统复杂度:引入工厂模式会增加系统的复杂度,尤其是对于简单的应用程序。如果系统本身不复杂,使用工厂模式可能会显得有些过度设计,增加了额外的抽象层和类的数量。对于小型项目,简单的对象创建逻辑不一定需要工厂模式。
可能导致类过多
难以适应频繁变化的需求:如果应用程序需要频繁地变化和修改对象的创建方式,工厂模式可能变得不够灵活。在这种情况下,可能需要更为灵活的设计模式,如 抽象工厂模式 或 依赖注入。