0
点赞
收藏
分享

微信扫一扫

设计模式 工厂方法模式

沪钢木子 2022-03-11 阅读 94

定义

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 ......");  
        }
    }

mybatisSqlSessionFactory 就是一个通用的工厂方法模式,用户在创建一个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 ......");  
        }
    }
举报

相关推荐

0 条评论