0

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

DAOFactory - 返回 MySQLFactory / SQLiteFactory 的一个实例

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

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

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

谢谢深

4

1 回答 1

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当您捆绑 MySQL 实现和loadSQLiteFactory捆绑 SQLite 实现时。

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

return (DAOFactory) Class.forName(System.getProperty("daoFactory")).newInstance();
于 2012-08-04T05:15:41.037 回答