综合使用抽象工厂、工厂方法的应用

03-04-18 manbaum
    

假设有一个应用,需要对数据库进行操作。虽然操作的表是一样的,但是,不同的用户连接的库可能不同,还可能不同的数据库存在于不同的数据库系统上。如何来实现呢?综合抽象工厂、工厂方法的使用,我们得到以下解决方法。

/*
 * 抽象工厂,定义对数据库的各种操作。
 */
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 对数据库进行操作 ...
   }
}
<p>

这样,用户无须知道它连接的具体数据库系统以及数据库名,就可以执行他需要的操作(使用抽象工厂接口),完成他自身的任务。具体使用何数据库系统上的哪个库,在用户登录后,由管理者指定(使用工厂方法工具类)。

    

banq
2003-04-28 16:39

好,不错,鼓掌......

bruce
2003-06-11 09:08

抽象产品在哪里?是不是Connection ? 好象又不象,似乎没有吧?

如果没有的话,我认为就不是一般的抽象工厂方法了,因为它的两个首要因素就是抽象产品,抽象工厂.并且所有的具体工厂类都要返回抽象产品,我倒不是死扣定义,只是觉得长得不和一般的抽象工厂一样罢了。

airport
2003-06-11 14:23

说几点看法,请多指教

关于你的抽象工厂 Interface Operations

我觉得本身定义太具体化了,违反面向对象的原则

因为你对数据库的操作,本身是一个具体的过程

定义在抽象工厂里面,我想如果以后扩展起来肯定很麻烦

所以不同数据库的操作,还是不适合用这个模式吧,应该是

bridge模式吧。

bruce
2003-06-11 20:19

我倒不觉得Interface Operations定义的太具体化,因为具不具体或抽不抽象取决于定义的方法operate1, operate2抽象程度。

感觉上面的代码只能称做工厂方法模式,根本没有抽象工厂模式。

呵呵,看到bridge模式,我就想起来斑主给咱们的加奶的咖啡,收益非浅呀。

4Go 1 2 3 4 下一页