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

2023-10-30

 最近看了一下阎宏博士的《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

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

  

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

透过简单例子说明“工厂方法模式”与“模板方法模式” 的相关文章

随机推荐

  • SpringBoot项目部署

    Springboot项目部署有两种方式 分别为 打包为jar war jar包和war包到部署服务器的区别和优缺点 1 部署war包 1 将war包解压 将里面的内容放到服务器项目的目录下 2 重启服务器 启动tomcat的时间会有些长 约
  • QNX系统BSP开发研发与应用,QNX技术解答-项目开发-软件开发

    如果你认为本系列文章对你有所帮助 请大家有钱的捧个钱场 点击此处赞助 赞助额0 1元起步 多少随意 声明 本文只用于个人学习交流 若不慎造成侵权 请及时联系我 立即予以改正 锋影 email 174176320 qq com 目前总结了一些
  • [LeetCode-27]-Remove Element (删除指定元素)

    文章目录 题目相关 Solution 题目相关 题目解读 使用In place 原地算法 从数组中删除指定值的所有元素 并返回删除后的数组长度 原题描述 原题链接 Given an array nums and a value val re
  • python函数式编程——迭代器(2)

    文章目录 前言 一 迭代器 前言 python学习笔记 仅供学习使用 一 迭代器 迭代是访问集合元素的 种 式 迭代器是 个可以记住遍历的位置的对象 迭代器对象从集合的第 个元素开始 访问 直到所有的元素被访问完结束 迭代器只能往前不会后退
  • java 静态变量 静态代码初始化块 构造函数的顺序

    静态变量或静态代码块 先后与代码书写顺序有关 初始化代码块或普通变量 顺序与代码书写顺序有关 构造函数 几大原则 一 静态成员变量 Static 1 静态成员变量为类变量 所有对象共享同一内存空间 2 静态成员变量的声明和定义仅在首次加载类
  • 视频无损放大软件:Topaz Video Enhance AI Mac版(支持m1)

    Topaz Video Enhance AI for Mac是一款专业的AI视频无损放大软件 topaz video enhance ai mac版使用时间信息有效提高视频质量和细节 从而达到最好的视频放大 去隔行 降噪和还原效果 另外to
  • gitlab目录功能结构

    默认安装的gitlab 主要有四个目录 opt gitlab 主目录 etc gitlab 放置配置文件 var opt gitlab 各个组件 var log gitlab 放置日志文件 功能操作 检查gitlab各组件状态 gitlab
  • 浅议代码安全检测

    2017年6月1日 中华人民共和国网络安全法 正式实施 等级保护工作正式入法 等级保护制度已成为新时期国家网络安全的基本国策和基本制度 2019年12月1日 网络安全等级保护条例 正式实施 等保2 0是从 信息安全等级保护制度 到 网络安全
  • 卸载vs2010亲测的一个方法

    最近想把vs2010卸载掉 把方法记录下 供需要的人参考 采用的方法是vs自带的卸载的方法 步骤如下 1 打开 控制面板 点击 卸载程序 在弹出的窗口里面找到vs2010的主程序 如图 2 双击打开后 或是右键弹出 卸载 更改 菜单 进入维
  • windows10环境下用anaconda和VScode配置

    文件下载 最新的Anaconda3 5 1 0 Windows x 64 exe版本中在安装的时候已经打包好了vscode 就是在anaconda3安装完成之后 会提示你是否要安装vscode 然后勾选就可以完成vscode的安装 Anac
  • vue实现消息提示框

    我们常常看到很多vue生态下的ui框架的消息提示框 在页面切换的时候依然停留在页面 我们知道vue这种单页面渐进式框架 所有的操作和元素都是挂载在一个节点上的 当路由变化是整个节点下的dom元素也在重新渲染 若要实现ui框架中的类似的消息提
  • 常用损失函数小结

    一 摘要 本文主要总结一下常见的损失函数 包括 MSE均方误差损失函数 SVM合页损失函数 Cross Entropy交叉熵损失函数 目标检测中常用的Smooth L1损失函数 其中还会涉及到梯度消失 梯度爆炸等问题 ESM均方误差 Sig
  • 【2017-07-04】Qt信号与槽深入理解之一:信号与槽的连接方式

    今天是个好日子 嗯 信号槽机制是Qt的特色功能之一 类似于windows中的消息机制 在不同的类对象间传递消息时我们经常使用信号槽机制 然而很多时候都没有去关注connect 函数到底有几种重载的形式 其中的各项参数都是什么 如果总是浮于表
  • Python opencv局部直方图均衡增强

    opencv直方图均衡包含两种 一种是对全图进行直方图均衡 另一种是对局部进行直方图均衡 也称为自适应直方图均衡 直方图均衡是让图像的像素分布更加均匀 一般可以使图片更亮 解决偏色问题 增加局部细节等 1 全局直方图均衡 全局直方图均衡的函
  • SpringBoot 中 Json 格式化配置

    SpringBoot 针对 jackson 是自动化配置的 如果需要修改 也可以自定义配置 0x01 通过 application yml 配置属性说明 spring jackson date format 指定日期格式 比如 yyyy M
  • 窗口函数之ntile()函数讲解

    ntile NTILE n 用于将分组数据按照顺序切分成n片 返回当前切片值 将一个有序的数据集划分为多个桶 bucket 并为每行分配一个适当的桶数 切片值 第几个切片 第几个分区等概念 它可用于将数据划分为相等的小切片 为每一行分配该小
  • WIN10 64位 OSG3.4+Qt5.3+VS2013 编译及使用dae插件、dxf插件

    OSG经过一段时间的发展 相比以前的开发来说 在编译安装上的步骤已经简单许多 但依旧存在许多的坑 本文简单阐述了在64位win10系统上 使用VS2013编译工具结合Qt5 3库 编译安装了带dae 3ds等3D显示插件的3 4版本的Ope
  • 标准IO及其各函数用法

    目录 综述标准IO与文件IO 1 fopen 函数 打开一个文件 2 fclose函数 关闭流 3 读写函数 3 1按字符读写 3 1 1 fgetc函数 从指定流中读取一个字符 3 1 2 fputc函数 向流中输出一个字符 3 1 3案
  • 你要的一眼就能看懂的【this全解】

    this指向谁 招数千万 万里归一 宝典只有一句 取决于 当前this所在函数的调用 分析 就两点 所在函数 调用 怎么看 不用管this外面包了几层函数 或几层对象 就看当前this所在的函数 看这个函数是怎么被调用的 注意调用 没有调用
  • 透过简单例子说明“工厂方法模式”与“模板方法模式”

    最近看了一下阎宏博士的 java与模式 看的不多 的确很经典 通俗易懂 工作中很多的问题一下子就明朗了 本人菜鸟 今天看到 工厂方法模式 Factory Method 的一道思考题 其中又简单涉及了 模板方法模式 Template Meth