假设有一个应用,需要对数据库进行操作。虽然操作的表是一样的,但是,不同的用户连接的库可能不同,还可能不同的数据库存在于不同的数据库系统上。如何来实现呢?综合抽象工厂、工厂方法的使用,我们得到以下解决方法。
/*
* 抽象工厂,定义对数据库的各种操作。
*/
public Interface Operations
{
public int operation1();
public void operation2(String paramString1);
// ... 其他操作 ...
}
/*
* 工厂方法,根据不同数据库系统及数据库,建立操作工厂。
*/
public class OperationsFactory
{
public static final int DBMS_MYSQL = 1;
public static final int DBMS_MSSQL = 2;
public static final int DBMS_ORACLE = 3;
// 工具类,禁止实例化
private OperationsFactory()
{
}
public static Operations getOperations(int dbms, String dbName)
{
Operations op;
switch (dbms)
{
case DBMS_MYSQL:
// ... 获得 MySQL 数据库实现 ...
op = new MysqlOperations(dbName);
break;
case DBMS_MSSQL:
// ... 获得 Microsoft SQL Server 数据库实现 ...
op = new MssqlOperations(dbName);
break;
case DBMS_ORACLE:
// ... 获得 Oracle 数据库实现 ...
op = new OracleOperations(dbName);
break;
default:
throw new Exception("Unsupported dbms: " + dbms);
}
return op;
}
}
/*
* 抽象工厂的具体实现,针对 MySQL 数据库系统。
* 类似的可以有针对 M$ SQL Server 及 Oracle 的具体实现。
*/
public class MysqlOperations implements Operations
{
private Connection conn;
public MysqlOperations(String dbName)
{
// ... 根据 dbName 生成连接
conn = ...
}
// ... 实现接口方法 operation1 ...
public int operation1()
{
// 使用 conn 对数据库进行操作 ...
}
// ... 实现接口方法 operation2 ...
public void operation2(String paramString1)
{
// 使用 conn 对数据库进行操作 ...
}
}
这样,用户无须知道它连接的具体数据库系统以及数据库名,就可以执行他需要的操作(使用抽象工厂接口),完成他自身的任务。具体使用何数据库系统上的哪个库,在用户登录后,由管理者指定(使用工厂方法工具类)。