定义
Define an interface for creating an object,but let subclasses decide which class to instantiate.
Factory Method lets a class defer instantiation to subclasses.(定义一个创建对象的接口,但让子类决定实例化哪个类。工厂方法允许类将实例化延迟到子类。)
我们就以mybatis的sqlsessionFactory为例来讲解
类图
工厂相关类
定义一个工厂接口,具有一个生产sqlsession产品的方法
定义一个工厂接口实现类,负责实现创建sqlsession产品的具体逻辑
产品相关类
定义一个产品接口,具有一个产品功能的方法
定义一个产品实现类,负责实现产品功能的具体逻辑
工厂接口
public interface SqlSessionFactory {
SqlSession openSession();
}
工厂实现类
public class DefaultSqlSessionFactory implements SqlSessionFactory {
public SqlSession openSession() {
Transaction tx = null;
DefaultSqlSession var8;
----------------业务逻辑不用看-----------------------
try {
Environment environment = this.configuration.getEnvironment();
TransactionFactory transactionFactory = this.getTransactionFactoryFromEnvironment(environment);
tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
Executor executor = this.configuration.newExecutor(tx, execType);
----------------创建一个sqlsession产品---------------------
var8 = new DefaultSqlSession(this.configuration, executor, autoCommit);
} catch (Exception var12) {
this.closeTransaction(tx);
throw ExceptionFactory.wrapException("Error opening session. Cause: " + var12, var12);
} finally {
ErrorContext.instance().reset();
}
----------------业务逻辑不用看-----------------------
return var8;
}
}
产品接口
public interface SqlSession extends Closeable {
int insert(String var1);
}
产品实现类
public class DefaultSqlSession implements SqlSession {
public int insert(String var1) {
//执行数据库插入逻辑
}
}
调用场景
public class Client{
public static void main(String[] args) {
SqlSessionFactory sessionFactory = new DefaultSqlSessionFactory();
SqlSession sqlSession = sessionFactory.openSession();
sqlSession.insert("insert into ......");
}
}
mybatis
的SqlSessionFactory
就是一个通用的工厂方法模式,用户在创建一个SqlSession
不用关心产品的具体实现逻辑,只要调用工厂的openSession方法即可得到sqlssisson对象。
其次工厂方模式的扩展性也非常优秀,如果需要添加一种产品类,只要修改工厂类或扩展一个工厂类,就能生产不同的产品,而新的产品的都实现于同一个SqlSession,调用方不用修改使用产品接口的代码 实现代码之间的解耦。
例如
public class Client{
public static void main(String[] args) {
SqlSessionFactory sessionFactory = new SqlSessionManager();
SqlSession sqlSession = sessionFactory.openSession();
sqlSession.insert("insert into ......");
}
}