首页 > 其他分享 >工厂方法模式

工厂方法模式

时间:2024-12-07 15:43:09浏览次数:6  
标签:Product openSession 模式 工厂 SqlSession import 方法 public

介绍

工厂方法模式定义了一个用于创建对象的接口,由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。

在工厂方法模式中,创建对象的工作由具体的工厂类来完成,客户端只需要知道所需产品的具体工厂,而无需关心创建细节。

示例

下面是一个简单的工厂方法模式的示例代码:

// 抽象产品类
interface Product {
    void use();
}

// 具体产品类 A
class ProductA implements Product {
    public void use() {
        System.out.println("Product A is used.");
    }
}

// 具体产品类 B
class ProductB implements Product {
    public void use() {
        System.out.println("Product B is used.");
    }
}

// 抽象工厂类
interface Factory {
    Product createProduct();
}

// 具体工厂类 A
class FactoryA implements Factory {
    public Product createProduct() {
        return new ProductA();
    }
}

// 具体工厂类 B
class FactoryB implements Factory {
    public Product createProduct() {
        return new ProductB();
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Factory factoryA = new FactoryA();
        Product productA = factoryA.createProduct();
        productA.use();

        Factory factoryB = new FactoryB();
        Product productB = factoryB.createProduct();
        productB.use();
    }
}

在上面的代码中,Product是抽象产品类,它定义了产品对象的通用接口。ProductAProductB是具体的产品类,它们实现了Product接口。

Factory是抽象工厂类,它定义了创建产品的接口。FactoryAFactoryB是具体的工厂类,它们实现了Factory接口,并提供了创建产品的方法。

在客户端代码中,我们首先创建了两个工厂对象factoryAfactoryB,然后分别调用它们的createProduct()方法来创建对应的产品对象。最后,我们调用产品对象的use()方法来使用产品。

工厂方法模式使得客户端代码不必关心产品对象的创建细节,只需要知道所需产品的具体工厂即可。和简单工厂模式相比,工厂方法模式可以更方便地扩展新产品,比如,如果我们需要添加一个新的产品类ProductC,只需要创建一个新的工厂类FactoryC,并实现createProduct()方法即可,而不需要修改原有工厂类。

工厂方法模式很好地体现了“对扩展开放,对修改关闭”的设计原则。

在 MyBatis 中的应用

在 MyBatis 中,SqlSessionFactory 和 SqlSession 就是工厂方法模式的应用。SqlSessionFactory 是工厂接口,它定义了创建 SqlSession 的方法。

SqlSessionFactory:

package org.apache.ibatis.session;

import java.sql.Connection;

public interface SqlSessionFactory {

  SqlSession openSession();

  SqlSession openSession(boolean autoCommit);
  SqlSession openSession(Connection connection);
  SqlSession openSession(TransactionIsolationLevel level);

  SqlSession openSession(ExecutorType execType);
  SqlSession openSession(ExecutorType execType, boolean autoCommit);
  SqlSession openSession(ExecutorType execType, TransactionIsolationLevel level);
  SqlSession openSession(ExecutorType execType, Connection connection);

  Configuration getConfiguration();

}

SqlSession:

package org.apache.ibatis.session;

import java.io.Closeable;
import java.sql.Connection;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.cursor.Cursor;
import org.apache.ibatis.executor.BatchResult;

public interface SqlSession extends Closeable {

  <T> T selectOne(String statement);

  <T> T selectOne(String statement, Object parameter);

  <E> List<E> selectList(String statement);

  // ...
}

DefaultSqlSessionFactory 实现了 SqlSessionFactory 接口:

public class DefaultSqlSessionFactory implements SqlSessionFactory {
  @Override
  public SqlSession openSession() {
    return openSessionFromDataSource(configuration.getDefaultExecutorType(), null, false);
  }

  private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {
    Transaction tx = null;
    try {
      final Environment environment = configuration.getEnvironment();
      final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);
      tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
      final Executor executor = configuration.newExecutor(tx, execType);
      return new DefaultSqlSession(configuration, executor, autoCommit);
    } catch (Exception e) {
      closeTransaction(tx); // may have fetched a connection so lets call close()
      throw ExceptionFactory.wrapException("Error opening session.  Cause: " + e, e);
    } finally {
      ErrorContext.instance().reset();
    }
  }

  // ...
}

其实现方法的返回值是 DefaultSqlSession 对象,DefaultSqlSession 实现了 SqlSession 接口:

public class DefaultSqlSession implements SqlSession {
  @Override
  public <T> T selectOne(String statement) {
    return this.<T>selectOne(statement, null);
  }

  // ...
}

参考:ChatGPT

标签:Product,openSession,模式,工厂,SqlSession,import,方法,public
From: https://www.cnblogs.com/Higurashi-kagome/p/17481308.html

相关文章

  • 简单工厂模式
    简单工厂模式(又称静态工厂模式):定义一个创建对象的类,由这个类来封装实例化对象的行为。简单工厂模式应用场景:当我们需要根据传入的参数来动态创建对象时,可以使用简单工厂模式。简单工厂模式的角色:工厂类(Creator):负责创建产品的类。在简单工厂模式中,工厂类提供了一个静态......
  • 怎么获取Win11推送?获取Win11推送方法
    Win11发布了正式版之后,很多用户进行了升级,但是还是有的用户处于观望,但是发现自己的系统没有获取到Win11的推送,导致没办法进行升级,那这个问题怎么解决呢,下面教给大家获取Win11推送的方法,大家快去试试。具体内容如下首先在左下角的开始菜单中找到“设置”。在设......
  • gorm:debug方法
    一,debug方法的作用:GORM提供了一个 Debug 方法,可以在链式调用中打印出生成的 SQL语句和执行时间。一般用于开发或者是线上排查某个问题时使用。Debug单个操作时,会将当前操作的log级别调整为logger.Info官方文档地址:https://gorm.io/zh_CN/docs/logger.html二,例子:......
  • 【C#】一个有意思的方法nameof
    在C#中,nameof是一个用于获取表达式的符号名称的关键字。它可以用来获取某个变量、类型、方法、属性等的名称,返回值是字符串类型。基本语法nameof(表达式)作用nameof关键字的主要作用是返回某个标识符(变量、类型、属性等)的名称。它返回的名称是编译时计算的,因......
  • MATLAB 在制冷循环建模中的应用:原理、方法与案例解析 
     一、制冷循环基础与MATLAB建模的意义 制冷循环是通过消耗能量将热量从低温区域转移到高温区域的过程,常见的制冷循环包括蒸气压缩式制冷循环等。在制冷系统的设计、优化与性能分析中,精确的建模至关重要。MATLAB作为一款强大的科学计算与工程仿真软件,为制冷循环建模提供......
  • 电机功率、电压与电流的换算方法
    在电气工程和相关行业中,电机的功率、电压和电流是三个重要的基本参数。它们之间有着密切的关系,而理解这些关系对于电机的选型、设计和应用至关重要。本文将详细阐述这三者之间的换算关系,以及相关公式的应用。一、电机功率的定义电机功率是电机在单位时间内所消耗或输出的能量......
  • swoole协程curl请求方法
    functionswoole_http_get($urls){$result=[];\Yurun\Util\YurunHttp::setDefaultHandler(\Yurun\Util\YurunHttp\Handler\Swoole::class);$scheduler=new\Swoole\Coroutine\Scheduler();foreach($urlsas$url){$scheduler-&......
  • 说说防止重复发送ajax请求的方法有哪些?各自有什么优缺点?
    防止重复发送AJAX请求是前端开发中一个常见的问题,尤其是在网络延迟较高或用户操作频繁的情况下。以下是一些常用的方法,以及它们的优缺点:1.禁用提交按钮:方法:在AJAX请求发送后,立即禁用提交按钮,并在请求完成后重新启用。优点:简单易实现,可以有效防止用户在请求处理期间......
  • 写一个方法判断数组内元素是否全部相同
    functionareAllElementsEqual(arr){if(!arr||arr.length===0){returntrue;//Emptyornullarrayisconsideredtohaveallelementsequal}constfirstElement=arr[0];for(leti=1;i<arr.length;i++){if(arr[i]!==firs......
  • js源代码压缩都有哪些方法?它们的压缩原理分别是什么?
    JS源代码压缩主要有以下几种方法,以及它们的压缩原理:1.移除不必要的字符:原理:删除代码中对执行没有影响的字符,例如空格、换行符、注释、以及代码块间的多余空行。方法:正则表达式替换、语法分析树遍历。效果:减小文件大小,提高加载速度。示例:将vara=1;//声明......