Java设计模式-工厂模式

Java设计模式-工厂模式

关于Java的全部设计模式和分类,在单例模式中已有。

工厂模式

简介

定义创建对象的接口(工厂),让其子类决定实例化哪一个类。

场景

这里会举两个例子,一个自己举的例子,一些工厂模式的实际使用场景

创建汽车的例子

1.产品接口

首先定义一个产品的接口,比如以创建汽车的例子,例如有一个Car接口:

public interface Car {
	void drive();
}

2.具体产品类

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用于生产汽车:

public interface CarFactory{
    Car produceCar();
}

然后有具体的类决定生产那种车:

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.使用示例

public class Main{
    public static void main(String[] args){
    	//使用轿车工厂生产轿车并启动
        SedanFactory s = new SedanFactory();
        Car sedun = s.produceCar();
        sedun.drive();
        
        //同理:请你写
	}
}

在这个例子中,CarFactory就是创建对象的工厂接口,SedanFactorySUVFactory是其子类,它们分别决定实例化SedanSUV类。这样如果要添加新类型的汽车,只需要创建新的汽车类和对应的工厂类,而不需要修改现在的代码,符合开闭原则。

然后就是关于工厂模式的实际应用

数据库连接池

  • 比如 HikariCPC3P0Druid 等常见的连接池实现,它们都会使用工厂模式来创建和配置数据库连接池对象。通常,连接池会暴露一个工厂类,通过工厂方法提供数据库连接对象,而用户不需要直接创建数据库连接对象,而是从连接池中获取。这种方式可以有效地管理数据库连接,避免每次请求都重新创建连接。例如,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 的数据库连接管理中及我举的例子中都有体现

符合开闭原则,使得扩展性很好

缺点

增加系统复杂度:引入工厂模式会增加系统的复杂度,尤其是对于简单的应用程序。如果系统本身不复杂,使用工厂模式可能会显得有些过度设计,增加了额外的抽象层和类的数量。对于小型项目,简单的对象创建逻辑不一定需要工厂模式。

可能导致类过多

难以适应频繁变化的需求:如果应用程序需要频繁地变化和修改对象的创建方式,工厂模式可能变得不够灵活。在这种情况下,可能需要更为灵活的设计模式,如 抽象工厂模式依赖注入

posted @ 2024-11-26 21:33  柳~  阅读(7)  评论(0编辑  收藏  举报