Java DAO模式和运行时依赖性

时间:2012-08-04 04:58:21

标签: java dao packaging

我们已经实现了典型的DAO /抽象工厂模式。设计是这样的:

DAOFactory - 返回MySQLFactory / SQLiteFactory

的实例
  • MySQLFactory - 返回与MySQL DB对话的DAO
  • SQLiteFactory - 返回与SQLite DB对话的DAO

事情很好。但是,我们需要创建两个可执行文件:提供给客户的可执行文件使用SQLiteFactory实例和相关的DAO。在该可执行文件中,我们不希望包含任何与MySQLFactory相关的类。如果我删除这些类,那么当类加载器加载DAOFactory类时,我们会在运行时看到ClassNotFoundException。

我们如何实现DAOFactory,以便在运行时不需要MySQLFactory?某些其他类也存在同样的问题,即只有内部版本的应用程序才需要某些类。什么是一种好的实施方式,以便我们可以从发送给客户的软件中排除类?

由于 深

1 个答案:

答案 0 :(得分: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();
  }
}

然后,您可以针对特定版本的软件调用正确的方法,例如,在捆绑MySQL实现时loadMySQLFactory和捆绑SQLite实现时loadSQLiteFactory

您甚至可以将类名作为JVM属性传递,例如。 -DdaoFactory=your.package.MySQLFactory然后使用它来加载正确的类:

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