透过简单例子说明“工厂方法模式”与“模板方法模式”
2013-12-17 13:20
351 查看
最近看了一下阎宏博士的《java与模式》,看的不多,的确很经典,通俗易懂,工作中很多的问题一下子就明朗了(本人菜鸟……)。
今天看到"工厂方法模式"(Factory Method)的一道思考题,其中又简单涉及了"模板方法模式"(Template Method),原来工作中不懂的地方就是用的这样的开发模式。书中的例子比较简单,很容易理解,所以就敲了一下代码,理解了一下。
题目的大意是:
现有两个数据库,假设是Mysql与Oracle两个数据库,要在Client客户端上分别能查出两个不同的数据库的结果,通过工厂方法模式,设计一个合理的方案。
关于什么是工厂方法模式,书中给出的定义是:
工厂方法模式是类的创建模式,又叫做虚拟构造子模式或者多态性工厂模式。工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。
首先贴出他们之间关系的类图:
![](http://images.cnitblog.com/blog/481926/201312/17131655-4e7627bc0d9b464185ffb976944b1cc7.png)
代码部分如下:
AbstractQueryRunner.java
AbstractQueryRunner的两个子类,即操作两个数据库的类:
MysqlRunner.java
OracleRunner.java
可以看到,两个子类重写了父类没有具体实现的方法,这样做的好处是子类可以任意写自己内部的方法,是一种"开-闭原则"的体现。
客户端代码:
Client.java
这样就能实现使用工厂方法模式在客户端查询不同的数据库了。
总体使用了工厂方法模式,那模板方法模式体现在哪里呢,它就是其中的getResult()方法。关于模板方法模式的解释,我翻阅了一下该书,它其中解释的很详细,现摘录如下:
模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的构造子类可以以不同的方法实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。
今天看到"工厂方法模式"(Factory Method)的一道思考题,其中又简单涉及了"模板方法模式"(Template Method),原来工作中不懂的地方就是用的这样的开发模式。书中的例子比较简单,很容易理解,所以就敲了一下代码,理解了一下。
题目的大意是:
现有两个数据库,假设是Mysql与Oracle两个数据库,要在Client客户端上分别能查出两个不同的数据库的结果,通过工厂方法模式,设计一个合理的方案。
关于什么是工厂方法模式,书中给出的定义是:
工厂方法模式是类的创建模式,又叫做虚拟构造子模式或者多态性工厂模式。工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。
首先贴出他们之间关系的类图:
![](http://images.cnitblog.com/blog/481926/201312/17131655-4e7627bc0d9b464185ffb976944b1cc7.png)
代码部分如下:
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()方法。关于模板方法模式的解释,我翻阅了一下该书,它其中解释的很详细,现摘录如下:
模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的构造子类可以以不同的方法实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。
相关文章推荐
- 用最简单的例子理解模板方法模式(Template Method Pattern)
- 模板方法模式(Template Method)c#简单例子
- (4)设计模式方法-创建型设计模式--:简单工厂模式【【【工厂方法模式
- java va中工厂模式( 静态工厂模式、工厂方法模式、抽象工厂模式)的介绍以及简单例子
- 学习设计模式:简单工厂、模板方法、单例(下)
- java 设计模式(简单工厂模式、工厂方法模式、单利模式、模板方法模式)
- 设计模式(06) 模板方法模式(简单入门 行为模式)
- 模式识别之目标跟踪---最简单的目标跟踪方法--------模板匹配与相关系数法
- 模板方法设计模式例子
- 例子说明java中的简单工厂模式
- java设计模式(工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式、适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式,。 行为型模式,共十一种:策略模式、模板方法)
- 设计模式 学习笔记(4)工厂方法模式、原型模式、模板方法模式
- 行为型模式11之2-TemplateMethod模板方法模式例子理解
- 模板方法设计模式简单实现
- 工厂方法模式--结合具体例子学习工厂方法模式
- 大话设计模式之五:6~10章(装饰模式 、代理模式、工厂方法模式、原型模式、模板方法模式)
- 工厂方法模式(一):简单工厂方法模式
- 学习设计模式:简单工厂、模板方法、单例(上)
- 工厂方法模式--结合具体例子学习工厂方法模式
- 设计模式之工厂方法模式VS简单工厂方法模式