2

私は現在、学校向けの小さなプロジェクトに取り組んでいます。私の Java アプリケーションではデータベースが必要で、アプリケーションでさまざまな種類のデータベースを使用できるようにしたいと考えています。そのため、現在、txt データベースと PostgreSQL を実装しています。将来的には、他のデータベース タイプを追加できるようになるはずです。XML や MySQL のように...

データベース インスタンスを作成するために、列挙型を使用するファクトリを設計しました。それは完全に機能しますが、私の意見ではあまり柔軟ではありません。それで、私はいくつかの調査を行いましたが、私にとって明確な本当に良い例は見つかりませんでした.

これは私の列挙型です:

public enum DatabaseType {
    TXT,
    SQL,
    XML;
}

これは私の工場です:

public class DatabaseFactory {      

    public Database createDatabase(DatabaseType type, String databaseName) throws DatabaseException {
        if(type.equals(DatabaseType.TXT)) {
            return new FileDatabase(databaseName);
        }else if(type.equals(DatabaseType.SQL)) {
            return new SQLDatabase(databaseName);
        }else if(type.equals(DatabaseType.XML)) {
            return new XMLDatabase(databaseName);
        }else {
            //default
            return new FileDatabase(databaseName);
        }
    }
}

私の目的は、ファクトリ自体に触れずに、将来のみ列挙型を編集することです。これで十分な柔軟性が得られるはずですが、どうすればこれができるかわかりません。

4

2 に答える 2

3

工場をenumそれ自体に入れることができます。

public enum DatabaseType {
    TXT {
        @Override
        public Database createDatabase(String databaseName) {
            return new FileDatabase(databaseName);
        }
    },
    SQL {
        @Override
        public Database createDatabase(String databaseName) {
            return new SQLDatabase(databaseName);
        }
    },
    XML {
        @Override
        public Database createDatabase(String databaseName) {
            return new XMLDatabase(databaseName);
        }
    };

    public abstract Database createDatabase(String databaseName);
}

Java では、enums は (C のように) 整数値の単なる名前ではありません。をより適切に考えるにはenum、固定数のインスタンスを持つクラスと考えてください。匿名クラスの概念とともに、列挙の各値に、その値に固有のさまざまなプロパティとメソッドを指定できます。

于 2012-12-22T20:02:32.860 に答える
1

リフレクションを使用する:

あなたの列挙型:

public enum DatabaseType {
    FILE(FileDatabase.class),
    SQL(SQLDatabase.class);

    private Database db;

   DatabaseType(Class<Database> db) {
      this.db = db;
   }

   /*package friendly*/ Class<Database> getDatabase() {
      return this.db;
   }
}

あなたの工場:

public class DatabaseFactory {

    public static Database create(DatabaseType type, String dbName) throws Exception {
       Database db = null;
       Constructor cons = type.getDatabase().getDeclaredConstructor(new Class[] { String.class });
       cons.setAccessible(true);
       db = cons.newInstance(dbName);

       return db;
    }

}

データベースの実装者:

public class FileDatabase extends Database {

    /* can only be instantiated via reflection */
    private FileDatabase(String databaseName) {
        // init db.
    }
}
于 2012-12-22T19:55:38.350 に答える