綜合使用抽象工廠、工廠方法的應用

manbaum發表於2003-04-18

假設有一個應用,需要對資料庫進行操作。雖然操作的表是一樣的,但是,不同的使用者連線的庫可能不同,還可能不同的資料庫存在於不同的資料庫系統上。如何來實現呢?綜合抽象工廠、工廠方法的使用,我們得到以下解決方法。

/*
 * 抽象工廠,定義對資料庫的各種操作。
 */
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>

這樣,使用者無須知道它連線的具體資料庫系統以及資料庫名,就可以執行他需要的操作(使用抽象工廠介面),完成他自身的任務。具體使用何資料庫系統上的哪個庫,在使用者登入後,由管理者指定(使用工廠方法工具類)。

相關文章