工厂模式
1、简单工厂
简单工厂比较简单,它的作用就是把对象的创建放到一个工厂类中,通过参数来创建不同的对象。
在分布式事务框架Seata中,如果发生异常,则需要进行二阶段回滚。
它的过程是,通过事务id找到undoLog记录,然后解析里面的数据生成SQL,将一阶段执行的SQL给撤销掉。
问题是SQL的种类包含了比如INSERT、UPDATE、DELETE,所以它们反解析的过程也不一样,就需要不同的执行器去解析。
在Seata中,有一个抽象的撤销执行器,可以生成一条SQL。
public abstract class AbstractUndoExecutor{//生成撤销SQLprotected abstract String buildUndoSQL();
}
然后有一个获取撤销执行器的工厂,根据SQL的类型,创建不同类型的执行器并返回。
public class UndoExecutorFactory {public static AbstractUndoExecutor getUndoExecutor(String dbType, SQLUndoLog sqlUndoLog) {switch (sqlUndoLog.getSqlType()) {case INSERT:return new MySQLUndoInsertExecutor(sqlUndoLog);case UPDATE:return new MySQLUndoUpdateExecutor(sqlUndoLog);case DELETE:return new MySQLUndoDeleteExecutor(sqlUndoLog);default:throw new ShouldNeverHappenException();}}
}
使用的时候,直接通过工厂类获取执行器。
AbstractUndoExecutor undoExecutor = UndoExecutorFactory.getUndoExecutor(dataSourceProxy.getDbType(),sqlUndoLog);
undoExecutor.executeOn(conn);
简单工厂模式有个小小的缺点:
一旦有了新的