[Java]Een factory met enum
Offtopic
Ja, ik weet het, is een tijdje geleden dat ik nog iets poste op PHPhulp. Mijn excuses daarvoor, klachten mag je sturen richting school.
[/small]
Ik ben voor school bezig met een applicatie in Java. Een deel hiervan gebruikt een database. Ik heb momenteel twee implementaties voorzien, eentje met een gewoon tekst-bestand en de andere implementatie gebruikt Postgresql.
Dit werkt allemaal prima, alleen wil ik nu via het Factory Pattern het gewenste type database laten instantiëren. Mijn eerste opzet was iets als volgt
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
package domain.database;
import domain.DomainException;
public class DatabaseFactory {
public Database createDatabase(String type, String name) throws DatabaseException, DomainException {
if(type.equals("TXT")) {
return new FileDatabaseV2(name);
}else if(type.equals("SQL")) {
return new FileDatabaseV2(name);
}else {
throw new DomainException("Invalid type");
}
}
}
import domain.DomainException;
public class DatabaseFactory {
public Database createDatabase(String type, String name) throws DatabaseException, DomainException {
if(type.equals("TXT")) {
return new FileDatabaseV2(name);
}else if(type.equals("SQL")) {
return new FileDatabaseV2(name);
}else {
throw new DomainException("Invalid type");
}
}
}
Alleen is dit niet zo erg netjes. Als ik straks een XML implementatie wil, dien ik mijn factory aan te passen. Daarom zat ik te denken om een enum te gebruiken. Dit heb ik echter nog nooit in deze combinatie gebruikt. Ik heb al wat voorbeeldjes proberen te vinden, maar ik kom er eerlijk gezegd niet uit.
Kan iemand mij op weg helpen?
Mvg,
Write Down
Prettige feesten aan iedereen toegewenst!
Je kan eens kijken naar Class.forName()... Je zal een beetje moeten refactoren maar je factory wordt een stuk flexibeler met oog op de toekomst.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
enum DatabaseType {
MYSQL(MySQLDatabase.class),
POSTGRES(PostgresDatabase.class)
private IDatabase db;
private DatabaseTypes(IDatabase db) {
this.db = db;
}
public IDatabase getDB() {
return db;
}
public static DatabaseType getDB(DatabaseType type) {
for (DatabaseType db : DatabaseType.values()) {
if (db == type) {
// niet helemaal zeker of dit werkt, maar dat moet je dan zelf even uitzoeken
return db.getDB().getInstance();
}
}
throw new Exception("Database not found");
}
}
MYSQL(MySQLDatabase.class),
POSTGRES(PostgresDatabase.class)
private IDatabase db;
private DatabaseTypes(IDatabase db) {
this.db = db;
}
public IDatabase getDB() {
return db;
}
public static DatabaseType getDB(DatabaseType type) {
for (DatabaseType db : DatabaseType.values()) {
if (db == type) {
// niet helemaal zeker of dit werkt, maar dat moet je dan zelf even uitzoeken
return db.getDB().getInstance();
}
}
throw new Exception("Database not found");
}
}
Dan kan je het dus zo aanroepen:
Je moet dan wel elke database een IDatabase laten implementeren