我们已经实现了典型的DAO /抽象工厂模式。设计是这样的:
DAOFactory - 返回MySQLFactory / SQLiteFactory
的实例事情很好。但是,我们需要创建两个可执行文件:提供给客户的可执行文件使用SQLiteFactory实例和相关的DAO。在该可执行文件中,我们不希望包含任何与MySQLFactory相关的类。如果我删除这些类,那么当类加载器加载DAOFactory类时,我们会在运行时看到ClassNotFoundException。
我们如何实现DAOFactory,以便在运行时不需要MySQLFactory?某些其他类也存在同样的问题,即只有内部版本的应用程序才需要某些类。什么是一种好的实施方式,以便我们可以从发送给客户的软件中排除类?
由于 深
答案 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();