Java计划模式-工厂模式

张裕  金牌会员 | 2024-11-26 20:06:51 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 566|帖子 566|积分 1698

Java计划模式-工厂模式

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

简介

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

这里会举两个例子,一个自己举的例子,一些工厂模式的实际使用场景
创建汽车的例子
1.产物接口
首先定义一个产物的接口,比如以创建汽车的例子,比方有一个Car接口:
  1. public interface Car {
  2.         void drive();
  3. }
复制代码
2.具体产物类
  1. public class Sedan implements Car {
  2.         @Override
  3.         public void drive(){
  4.                 System.out.println("轿车启动");       
  5.         }
  6. }
  7. public class SUV implements Car {
  8.     @Override
  9.     public void drive(){
  10.         System.out.println("SUV启动");
  11.     }
  12. }
复制代码
3.工厂接口和具体工厂类
定义一个工厂接口CarFactory用于生产汽车:
  1. public interface CarFactory{
  2.     Car produceCar();
  3. }
复制代码
然后有具体的类决定生产那种车:
  1. public class SedanFactory implements CarFactory{
  2.     @Override
  3.     public Car produceCar(){
  4.         return new Sedan();
  5.     }
  6. }
  7. public class SUVFactory implements CarFactory {
  8.     @Override
  9.     public Car produceCar(){
  10.         return new SUV();
  11.     }
  12. }
复制代码
4.使用示例
  1. public class Main{
  2.     public static void main(String[] args){
  3.             //使用轿车工厂生产轿车并启动
  4.         SedanFactory s = new SedanFactory();
  5.         Car sedun = s.produceCar();
  6.         sedun.drive();
  7.         
  8.         //同理:请你写
  9.         }
  10. }
复制代码
在这个例子中,CarFactory就是创建对象的工厂接口,SedanFactory和SUVFactory是其子类,它们分别决定实例化Sedan和SUV类。这样如果要添加新类型的汽车,只必要创建新的汽车类和对应的工厂类,而不必要修改现在的代码,符合开闭原则。
然后就是关于工厂模式的实际应用
数据库毗连池

  • 比如 HikariCP、C3P0、Druid 等常见的毗连池实现,它们都会使用工厂模式来创建和配置数据库毗连池对象。通常,毗连池会暴露一个工厂类,通过工厂方法提供数据库毗连对象,而用户不必要直接创建数据库毗连对象,而是从毗连池中获取。这种方式可以有效地管理数据库毗连,制止每次请求都重新创建毗连。比方,HikariCP(一个高性能的数据库毗连池),在初始化时使用了类似工厂模式的计划:
    1. java复制代码HikariDataSource dataSource = new HikariDataSource();
    2. dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/mydatabase");
    3. dataSource.setUsername("user");
    4. dataSource.setPassword("password");
    复制代码
    在这个过程中,HikariDataSource 实际上充当了工厂类,用户通过它来配置和获取数据库毗连。
序列化与反序列化

  • 在一些框架中(如 JSON 或 XML 剖析库),工厂模式用于根据配置创建不同类型的对象,或者根据数据格式(JSON、XML)动态选择适当的剖析器。
日志框架

  • 在一些日志框架(如 Log4j 或 SLF4J)中,工厂模式用于根据配置生成不同类型的日志记录器对象。通常通过工厂方法来选择不同的日志级别、输出目标地等。
MyBatis中的应用

  • 在 MyBatis 中,工厂模式也有应用,重要体现在数据库毗连和会话管理的部分。
    SqlSessionFactory:MyBatis 的焦点工厂类之一就是 SqlSessionFactory,它用于创建和管理 SqlSession 对象。SqlSessionFactory 是一个典型的工厂模式实现。它通过读取 MyBatis 配置文件(如 mybatis-config.xml),根据配置信息来创建 SqlSession 对象。
    比方,以下是 MyBatis 中创建 SqlSessionFactory 的方式:
    1. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    复制代码
    SqlSessionFactory 的构建通常必要配置数据源、映射器等信息,它会根据这些配置生成 SqlSession 实例,而用户则通过 SqlSessionFactory 获取到 SqlSession,并通过它来执行数据库操作。这一过程的焦点就是通过工厂模式动态创建和管理 SqlSession 对象。
优点

就联合上面的例子,理解为什么要使用它,不使用就不行吗?
解耦对象创建和使用,在 MySQL 和 MyBatis 的数据库毗连管理中及我举的例子中都有体现
符合开闭原则,使得扩展性很好
缺点

增长体系复杂度:引入工厂模式会增长体系的复杂度,尤其是对于简单的应用步伐。如果体系本身不复杂,使用工厂模式可能会显得有些过分计划,增长了额外的抽象层和类的数量。对于小型项目,简单的对象创建逻辑不一定必要工厂模式。
可能导致类过多
难以顺应频繁变化的需求:如果应用步伐必要频繁地变化和修改对象的创建方式,工厂模式可能变得不敷机动。在这种情况下,可能必要更为机动的计划模式,如 抽象工厂模式依赖注入

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张裕

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表