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

需求如下:

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

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

相关推荐
jianqimingtian7 分钟前
如何使用 Matlab 制作 GrabCAD 体素打印切片
数据结构·数据库
真真假假々12 分钟前
MySQL和ADSDB
数据库·mysql
秦老师Q14 分钟前
MySQL第二章 sql约束与sql数据类型
数据库·sql·mysql
不是二师兄的八戒18 分钟前
mysql in查询大数据量业务无法避免情境下优化
数据库·mysql
----云烟----32 分钟前
Qt获取文件夹下的文件个数(过滤和不过滤的区别)
数据库·qt
Dotrust东信创智32 分钟前
浅谈丨功能安全测试,汽车的守护者
运维·服务器·数据库
清水白石0082 小时前
从一个“支付状态不一致“的bug,看大型分布式系统的“隐藏杀机“
java·数据库·bug
Python私教6 小时前
model中能定义字段声明不存储到数据库吗
数据库·oracle
BestandW1shEs9 小时前
谈谈Mysql的常见基础问题
数据库·mysql
重生之Java开发工程师9 小时前
MySQL中的CAST类型转换函数
数据库·sql·mysql