2012-08-04 61 views
0

我們實現了典型的DAO /抽象工廠模式。設計是這樣的:Java DAO模式和運行時依賴關係

DAOFactory - 返回要麼MySQLFactory的實例/ SQLiteFactory

  • MySQLFactory - 回報的DAO,爲MySQL數據庫會談
  • SQLiteFactory - 回報的DAO是會談的SQLite數據庫

事情很好。但是,我們需要創建兩個可執行文件:向客戶提供的可執行文件使用SQLiteFactory實例和相關的DAO。在那個可執行文件中,我們不想包含任何與MySQLFactory相關的類。如果我刪除這些類,那麼在類加載器加載DAOFactory類時,運行時會看到ClassNotFoundException。

我們如何實現我們的DAOFactory,以便在運行時不需要MySQLFactory?對於某些其他類也存在同樣的問題,即只有內部版本的應用需要某些類。什麼是一種很好的實施方式,以便我們可以將軟件中的課程排除到客戶手中?

感謝 深

回答

0

您可以使用Class.forName在運行時加載的類。例如:

public class DAOFactoryLoader { 
    public static DAOFactory loadMySQLFactory() { 
    return (DAOFactory) Class.forName("your.package.MySQLFactory").newInstance(); 
    } 

    public static DAOFactory loadSQLiteFactory() { 
    return (DAOFactory) Class.forName("your.package.SQLiteFactory").newInstance(); 
    } 
} 

然後就可以調用正確的方法爲您的軟件的具體版本,即loadMySQLFactory當你當你捆綁的SQLite實現捆綁MySQL的執行和loadSQLiteFactory

甚至可以將類名作爲JVM屬性傳遞給例如。 -DdaoFactory=your.package.MySQLFactory然後用它來加載正確的類:

return (DAOFactory) Class.forName(System.getProperty("daoFactory")).newInstance();