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

发布于:2024-05-01 ⋅ 阅读:(30) ⋅ 点赞:(0)

需求如下:

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

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

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

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

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

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

该工具提供以下功能:

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

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

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

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

连接的接口:

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

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

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

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

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

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

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

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

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

设计图如下:

代码如下:

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();

   }
}

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

代码如下:

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 {
}
class SigletonConnection {// 饿汉模式
   private static SigletonConnection sigletonCon = new

   SigletonConnection() {

   };

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

public class Singleton {
}

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


网站公告

今日签到

点亮在社区的每一天
去签到