设计模式之工厂方法

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 设计模式中,工厂方法模式的使用还是很频繁的,但是似乎在工作中没有留意或者重视。 在各大网站中对于工厂方法模式的例子一般都是举女娲造人的例子,我就不做重复工作了,我觉得通过模拟oracle或者mysql的jdbc连接也是一个很生动的例子,我们完全可以通过工厂方法来模拟这种,对于不同的需求可以灵活的处理。
设计模式中,工厂方法模式的使用还是很频繁的,但是似乎在工作中没有留意或者重视。
在各大网站中对于工厂方法模式的例子一般都是举女娲造人的例子,我就不做重复工作了,我觉得通过模拟oracle或者mysql的jdbc连接也是一个很生动的例子,我们完全可以通过工厂方法来模拟这种,对于不同的需求可以灵活的处理。

为此我画了如下的UML图。
我们定义一个借口GeneralJDBC,其中有各种jdbc中涉及到的方法,但是对于这些方法,可能在Oracle,MySQL中会有一些不同之处,或者在使用中的细节差别。
我们定义了两个实现类OracleJDBC和MySQLJDBC
在此基础上,我们在需要调用的时候,可以根据对应的GeneralJDBC实现类来初始化连接。初始化的部分在DBConnInit中,这个类是一个抽象类,在DBConnFactory就是工厂方法的实现了。
里面会根据对应的GeneralJDBC来做实际的实例化工作。
这些工作做完以后就可以通过客户端来调用了。


实现的代码如下:

点击(此处)折叠或打开

  1. import java.sql.Connection;
  2. import java.sql.ResultSet;
  3. import java.sql.SQLException;
  4. import java.sql.Statement;


  5. public interface GeneralJDBC {
  6.     public Connection initConnection() throws SQLException;
  7.     public Statement createStatment(Connection conn) throws SQLException;
  8.     public ResultSet executeQuery(Statement stmt,String SQL) throws SQLException;
  9.     public void getRsResults(ResultSet rs) throws SQLException;
  10. }


点击(此处)折叠或打开

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


    public class OracleJDBC implements GeneralJDBC {
    @Override
    public Connection initConnection() throws SQLException {
    return DriverManager.getConnection(
    "jdbc:oracle:thin:@127.0.0.1:1521:test01", "system", "oracle");
    }


    @Override
    public Statement createStatment(Connection tmp_Conn) throws SQLException {
    return tmp_Conn.createStatement();
    }


    @Override
    public ResultSet executeQuery(Statement tmp_stmt, String SQL)
    throws SQLException {
    return tmp_stmt.executeQuery(SQL);
    }


    @Override
    public void getRsResults(ResultSet rs) throws SQLException {
    int columnCnt;
    columnCnt = rs.getMetaData().getColumnCount();
    for (int i = 1; i System.out.print(rs.getMetaData().getColumnLabel(i) + "\t ");
    }
    System.out.println();


    while (rs.next()) {
    for (int i = 1; i System.out.print(rs.getString(i) + "\t ");
    }
    System.out.println();
    }
    }


    }


点击(此处)折叠或打开

  1. import java.sql.Connection;
  2. import java.sql.ResultSet;
  3. import java.sql.Statement;


  4. public class MySQLJDBC implements GeneralJDBC{

  5.     @Override
  6.     public Connection initConnection() {
  7.     
  8.         return null;
  9.     }


  10.     @Override
  11.     public Statement createStatment(Connection conn) {
  12.         return null;
  13.     }
  14.     

  15.     @Override
  16.     public ResultSet executeQuery(Statement stmt, String SQL) {
  17.         return null;
  18.     }


  19.     @Override
  20.     public void getRsResults(ResultSet rs) {
  21.         // TODO Auto-generated method stub
  22.         
  23.     }

  24. }



点击(此处)折叠或打开

  1. public abstract class DBConnInit {
  2.     public abstract T extends GeneralJDBC> T initDBDriverClass(ClassT> dbDriverClass);
  3.     
  4. }


点击(此处)折叠或打开

  1. public class DBConnFactory extends DBConnInit {
  2.     @Override
  3.     public GeneralJDBC initDBDriverClass(ClassGeneralJDBC> dbDriverClass) {
  4.         GeneralJDBC dbDriver = null;
  5.         try {
  6.             dbDriver = (GeneralJDBC) Class.forName(dbDriverClass.getName()).newInstance();
  7.         } catch (InstantiationException e) {
  8.             e.printStackTrace();
  9.         } catch (IllegalAccessException e) {
  10.             e.printStackTrace();
  11.         } catch (ClassNotFoundException e) {
  12.             e.printStackTrace();
  13.         }
  14.         return dbDriver;
  15.     }

  16. }


点击(此处)折叠或打开

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


    public class ConnClient {
    public static void main(String[] args) throws SQLException {
    new ConnClient().test();


    }
    public void test() throws SQLException{
    Connection conn;
    Statement stmt;
    ResultSet rs;
    DBConnInit factory = new DBConnFactory();
    GeneralJDBC oracleJDBC = factory.initDBDriverClass(OracleJDBC.class);
    conn = oracleJDBC.initConnection();
    stmt = oracleJDBC.createStatment(conn);
    rs = oracleJDBC.executeQuery(stmt, "select *from cat");
    oracleJDBC.getRsResults(rs);
    }
    }

调用客户端程序的结果如下:
TABLE_NAME TABLE_TYPE  
LOGMNR_SESSION_EVOLVE$ TABLE  
LOGMNR_EVOLVE_SEQ$ SEQUENCE  
LOGMNR_SEQ$ SEQUENCE  
LOGMNR_DIDS$ SEQUENCE  
LOGMNR_UIDS$ SEQUENCE
。。。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
设计模式 开发者
探讨常见设计模式 - 工厂方法模式的最佳实践和潜在的实施问题
【4月更文挑战第7天】工厂方法模式是创建型设计模式,提供了一种在不指定具体类情况下创建对象的方式。它定义创建对象的接口,允许子类决定实例化哪个类,从而解耦对象的创建和使用。最佳实践包括明确接口、封装创建逻辑、提供扩展点和避免过度使用。然而,过度工程、违反开闭原则、性能影响和依赖管理是可能的问题。通过权衡利弊并遵循最佳实践,工厂方法模式能在适当场景下提升代码灵活性和可扩展性。
130 1
|
5月前
|
设计模式 Java 数据库连接
【设计模式】【创建型模式】工厂方法模式(Factory Methods)
一、入门 什么是工厂方法模式? 工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定实例化哪个类。工厂方法模式使类的实例化延迟
143 16
|
7月前
|
设计模式 Java 关系型数据库
设计模式:工厂方法模式(Factory Method)
工厂方法模式是一种创建型设计模式,通过将对象的创建延迟到子类实现解耦。其核心是抽象工厂声明工厂方法返回抽象产品,具体工厂重写该方法返回具体产品实例。适用于动态扩展产品类型、复杂创建逻辑和框架设计等场景,如日志记录器、数据库连接池等。优点包括符合开闭原则、解耦客户端与具体产品;缺点是可能增加类数量和复杂度。典型应用如Java集合框架、Spring BeanFactory等。
|
9月前
|
设计模式 关系型数据库
「全网最细 + 实战源码案例」设计模式——工厂方法模式
简单工厂模式是一种创建型设计模式,通过一个工厂类根据传入参数创建不同类型的产品对象,也称“静态工厂方法”模式。其结构包括工厂类、产品接口和具体产品类。适用于创建对象种类较少且调用者无需关心创建细节的场景。优点是封装性强、代码复用性好;缺点是扩展性差,增加新产品时需修改工厂类代码,违反开闭原则。
116 15
|
11月前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
这篇文章详细解释了工厂模式,包括简单工厂、工厂方法和抽象工厂三种类型。每种模式都通过代码示例展示了其应用场景和实现方法,并比较了它们之间的差异。简单工厂模式通过一个工厂类来创建各种产品;工厂方法模式通过定义一个创建对象的接口,由子类决定实例化哪个类;抽象工厂模式提供一个创建相关或依赖对象家族的接口,而不需要明确指定具体类。
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
|
设计模式 XML 存储
【二】设计模式~~~创建型模式~~~工厂方法模式(Java)
文章详细介绍了工厂方法模式(Factory Method Pattern),这是一种创建型设计模式,用于将对象的创建过程委托给多个工厂子类中的某一个,以实现对象创建的封装和扩展性。文章通过日志记录器的实例,展示了工厂方法模式的结构、角色、时序图、代码实现、优点、缺点以及适用环境,并探讨了如何通过配置文件和Java反射机制实现工厂的动态创建。
【二】设计模式~~~创建型模式~~~工厂方法模式(Java)
|
设计模式 uml
设计模式-------------工厂模式之工厂方法模式(创建型)
工厂方法模式是一种创建型设计模式,它通过定义一个用于创建对象的接口,让子类决定实例化哪一个类,从而实现类的实例化推迟到子类中进行,提高了系统的灵活性和可扩展性。
|
设计模式 Java
Java设计模式-工厂方法模式(4)
Java设计模式-工厂方法模式(4)
112 0
|
设计模式 Java
Java设计模式:工厂模式之简单工厂、工厂方法、抽象工厂(三)
Java设计模式:工厂模式之简单工厂、工厂方法、抽象工厂(三)

热门文章

最新文章