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

需求如下:

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

该工具由在容器(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分,感觉是运气使然,下一次要继续努力,付出该付出的代价,但结果就顺其自然吧。

相关推荐
隔窗听雨眠3 分钟前
MySQL整库迁移至KaiwuDB完全指南:从数据类型映射到生产切换的系统性实践
数据库·mysql
xhbh66619 分钟前
中小企业 Redis 运维,如何安全归档 RDB、AOF 备份文件?
运维·数据库·缓存·数据备份·文件备份·同步备份·号码备份
YHL41 分钟前
🎯 JavaScript 单例模式(Singleton Pattern)—— 从理论到实战
javascript·设计模式
勤奋的树懒42 分钟前
从手写 SQL 到 Windows 工具:致远 OA 文件清理实践
数据库·sql·windows server·致远oa
笃行3501 小时前
OceanBaseVS金仓:一条 SQL 的两条路——KingbaseES 的性能竞争力从哪来
数据库
其实防守也摸鱼1 小时前
每天一个知识点——RCE漏洞
运维·服务器·数据库·windows·安全·github·漏洞
TDengine (老段)1 小时前
TDengine 常见问题 TOP2
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
笃行3501 小时前
数据迁移工具 KDMS 帮我把一本糊涂账算清了
数据库
笃行3502 小时前
SQLServer数据库迁移实录:十年老系统搬上 KingbaseES,T-SQL 基本没重写
数据库
2401_868534782 小时前
网络环境规划核心考点全梳理
网络·设计模式