设计模式第一次测验 | 数据库连接设计(单例模式、抽象工厂模式、工厂模式)

需求如下:

我们需要设计一个工具,它负责创建一个与数据库软件的连接池。

该工具由在容器(Tomcat等)内运行的应用程序用来连接数据库软件。

在同一个容器中运行的所有应用程序共享同一个连接池对象。

现在我们需要支持以下数据库软件:MySQL、Oracle和SQL server

我们希望在未来支持更多的数据库软件。

所有支持或将要支持的数据库软件都必须根据连接工具定义的接口 提供自己的连接实现。

该工具提供以下功能:

使用指定的字符串初始化数据库信息。

创建连接池对象时,初始化具有指定连接数的连接池。

客户端可以从该池中获取连接以使用。

客户端可以在完成数据库操作后将连接放回该池。

连接的接口:

使用数据库信息初始化连接,数据库信息是指定的字符串。

客户端可以使用sql字符串将记录添加到表中。

客户端可以使用sql字符串从表中删除记录。

客户端可以使用sql字符串更新表中的记录。

客户端可以使用sql字符串从表中搜索记录。

每个数据库软件都有有限数量的可同时使用的连接。

连接工具应确保同时使用的连接数量永远不会超过该数据库软件的限制。

连接工具应允许多个线程或进程同时获得连接。

首先来分析下需求:需要支持三种数据库软件,要生产三种接口,以后可能还有更多,所以有工厂方法即工厂方法设计模式,如果要在工厂方法上再上升一个维度的话就是抽象工厂设计模式。

设计图如下:

代码如下:

java 复制代码
interface connection {
   public void connect();
   public void drop();
   public void add(String s);
   public void delete(String s);
   public void update(String s);
   public String search(String s);
}

class MySQLConnection implements connection {
   public void connect() {
       System.out.println("MySQL connect");
   }
   public void drop() {
       System.out.println("MySQL connection drop");
   }
   public void add(String s) {};
   public void delete(String s) {};
   public void update(String s) {};
   public String search(String s) {
       String nullptr = null;
       return nullptr; 
   };
}

class OracleConnection implements  connection {
   public void connect() {
       System.out.println("Oracle connect");
   }
   public void drop() {
       System.out.println("Oracle connection drop");
   }
   public void add(String s) {};
   public void delete(String s) {};
   public void update(String s) {};
   public String search(String s) {
       String nullptr = null;
       return nullptr;
   };
}

class SQLConnection implements  connection {
   public void connect() {
       System.out.println("SQL connect");
   }
   public void drop() {
       System.out.println("SQL connection drop");
   }
   public void add(String s) {};
   public void delete(String s) {};
   public void update(String s) {};
   public String search(String s) {
       String nullptr = null;
       return nullptr;
   };
}
interface connectionFactory {
   public connection createConnection();
}

abstract class FactoryProducer {
   public connectionFactory createFactory() {
       return null;
   }
}

class MySQLconFactory implements connectionFactory {
   public MySQLConnection createConnection() {
       return new MySQLConnection();
   }
}

class OracleconFactory implements connectionFactory {
   public OracleConnection createConnection() {
       return new OracleConnection();
   }
}

class SQLconFactory implements connectionFactory {
   public SQLConnection createConnection() {
       return new SQLConnection();
   }
}

public class Main {
   public static void main(String[] args) {
       connectionFactory MySQLFactory = new MySQLconFactory();
       MySQLConnection mysqlConnect  = (MySQLConnection)   		  MySQLFactory.createConnection();
       mysqlConnect.connect();

   }
}

此外需求中还提到同一个容器中所有应用程序共享同一个连接池对象,因此要用单例模式,懒汉模式和饿汉模式需求中没有区分,当时我有时间也有精力还有心情比较好就都实现了下,设计图如下:

代码如下:

java 复制代码
class SigletonConnection {// 懒汉模式
   private static SigletonConnection sigletonCon;
   private SigletonConnection(){
       if (sigletonCon == null) {
           synchronized (SigletonConnection.class) {
               if (sigletonCon == null) {
                   sigletonCon = new SigletonConnection();
               }
           }
       }
   };
   public static SigletonConnection getInstance() {
       return sigletonCon;
   }
}

public class Singleton {
}
java 复制代码
class SigletonConnection {// 饿汉模式
   private static SigletonConnection sigletonCon = new

   SigletonConnection() {

   };

   private SigletonConnection(){};
   public static SigletonConnection getInstance() {
       return sigletonCon;
   }
}

public class Singleton {
}

这次拿了100分,感觉是运气使然,下一次要继续努力,付出该付出的代价,但结果就顺其自然吧。

相关推荐
pixcarp6 小时前
知识库系统的内容资产闭环怎么设计
服务器·数据库·后端·golang
JosieBook6 小时前
【数据库】时序预测能力的分级进化:TimechoAI如何让每一类用户都能精准预见未来
java·开发语言·数据库
workflower7 小时前
使用大语言模型处理用户需求
大数据·人工智能·设计模式·重构·动态规划
吴声子夜歌8 小时前
SQL经典实例——使用多张表
数据库·sql
倔强的石头_9 小时前
《Kingbase护城河》——深度解密数据库行锁冲突与等待事件架构
数据库
IT策士10 小时前
Redis 从入门到精通:性能调优与多语言客户端对比
数据库·redis·缓存
Bert.Cai10 小时前
Oracle INSTR函数详解
数据库·oracle
geovindu12 小时前
go: Generators Pattern
开发语言·后端·设计模式·golang·生成器模式
茉莉玫瑰花茶12 小时前
综合案例 - AI 智能租房助手 [ 5 ]
服务器·数据库·人工智能·python·ai
ywl47081208712 小时前
jwt生产token,简单版helloworld
java·数据库·spring