透过简单例子说明“工厂方法模式”与“模板方法模式”

 最近看了一下阎宏博士的《java与模式》,看的不多,的确很经典,通俗易懂,工作中很多的问题一下子就明朗了(本人菜鸟……)。

  今天看到"工厂方法模式"(Factory Method)的一道思考题,其中又简单涉及了"模板方法模式"(Template Method),原来工作中不懂的地方就是用的这样的开发模式。书中的例子比较简单,很容易理解,所以就敲了一下代码,理解了一下。

  题目的大意是:

  现有两个数据库,假设是Mysql与Oracle两个数据库,要在Client客户端上分别能查出两个不同的数据库的结果,通过工厂方法模式,设计一个合理的方案。

  关于什么是工厂方法模式,书中给出的定义是:

  工厂方法模式是类的创建模式,又叫做虚拟构造子模式或者多态性工厂模式。工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。

  首先贴出他们之间关系的类图:

  

  

  代码部分如下:

  AbstractQueryRunner.java

import java.sql.Connection;
import java.sql.ResultSet;

public abstract class AbstractQueryRunner {
    
    public ResultSet getResult(){
        Connection con = createConnection();
        String sql = createQueryString();
        return runSql(con,sql);
    }
    
    protected abstract Connection createConnection();
    protected abstract String createQueryString();
    protected abstract ResultSet runSql(Connection con,String sql);
}

  

  AbstractQueryRunner的两个子类,即操作两个数据库的类:

  MysqlRunner.java

  

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class MysqlRunner extends AbstractQueryRunner {

    protected Connection createConnection(){
        //code here
        return con;
    }
    
    @Override
    protected String createQueryString() {
        String queryString = "SELECT * FROM User";
        return queryString;
    }

    protected ResultSet runSql(Connection con,String sql){
        try {
            Statement smt = con.createStatement();
            return smt.executeQuery(sql);
        } catch (SQLException e) {
            e.printStackTrace();
            return null;
        }
    }
}

 

  OracleRunner.java

  

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class OracleRunner extends AbstractQueryRunner {

    protected Connection createConnection(){
        //code here
        return con;
    }
    
    @Override
    protected String createQueryString() {
        String queryString = "SELECT * FROM User";
        return queryString;
    }

    protected ResultSet runSql(Connection con,String sql){
        try {
            Statement smt = con.createStatement();
            return smt.executeQuery(sql);
        } catch (SQLException e) {
            e.printStackTrace();
            return null;
        }
    }
}

 

可以看到,两个子类重写了父类没有具体实现的方法,这样做的好处是子类可以任意写自己内部的方法,是一种"开-闭原则"的体现。

  客户端代码:

  Client.java

  

import java.sql.ResultSet;
public class Client {

    public static void main(String[] args) {
        AbstractQueryRunner mRunner = new MysqlRunner();
        ResultSet result1 = mRunner.getResult();
        
        AbstractQueryRunner oRunner = new OracleRunner();
        ResultSet result2 = oRunner.getResult();
    }
    
}

 


这样就能实现使用工厂方法模式在客户端查询不同的数据库了。

总体使用了工厂方法模式,那模板方法模式体现在哪里呢,它就是其中的getResult()方法。关于模板方法模式的解释,我翻阅了一下该书,它其中解释的很详细,现摘录如下:

模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的构造子类可以以不同的方法实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。

 

https://www.cnblogs.com/bigbang92/p/3478262.html

  模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的构造子类可以以不同的方法实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。

  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值