0

典型的なDAO/AbstractFactoryパターンを実装しました。デザインは次のようになります。

DAOFactory-MySQLFactory/SQLiteFactoryのいずれかのインスタンスを返します

  • MySQLFactory-MySQLDBと通信するDAOを返します
  • SQLiteFactory-SQLiteDBと通信するDAOを返します

物事は大丈夫です。ただし、2つの実行可能ファイルを作成する必要があります。顧客に提供される実行可能ファイルは、SQLiteFactoryインスタンスと関連するDAOを使用します。その実行可能ファイルには、MySQLFactoryに関連するクラスを含めたくありません。これらのクラスを削除すると、DAOFactoryクラスがクラスローダーによってロードされている実行時にClassNotFoundExceptionが表示されます。

実行時にMySQLFactoryが不要になるように、DAOFactoryを実装するにはどうすればよいですか?同じ問題が他の特定のクラスにも存在します。つまり、特定のクラスはアプリの社内バージョンにのみ必要です。顧客に出荷されるソフトウェアからクラスを除外できるようにするための実装の良い方法は何ですか?

ありがとうディープ

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 に答える