抽象数据源和使用通用接口
这个想法是有一个通用适配器,可以将ResultSet
CSV 或 CSV 转换为一致接口后面的通用内容:
interface CarDataSource {
getCarId();
//...
}
和两个实现:
class CsvDataSource implements CarDataSource {
private final String[] row;
public CsvDataSource(String[] row) {
this.row = row;
}
public int getCarId() {
return Integer.parseInt(row[CSVColumns.carid.index]);
}
//...
}
class ResultSetDataSource implements CarDataSource {
private final ResultSet rs;
public ResultSetDataSource(ResultSet rs) {
this.rs = rs;
}
public int getCarId() {
return Integer.parseInt(rs.getString("Name));
}
//...
}
这就是你使用它的方式:
private Car processCar(CarDataSource s) {
Car c = new Car();
c.setCarId(s.getCarId());
....
return c;
}
提供new CsvDataSource()
或new ResultSetDataSource()
。
具有两种实现的抽象工厂:
非常相似的方法,创建和抽象工厂:
interface CarFactory {
Car create();
}
有两种实现:
class CsvCarFactory implements CarFactory {
private final String[] row;
public CsvDataSource(String[] row) {
this.row = row;
}
public Car create() {
Car c = new Car();
c.setCarId(Integer.parseInt(row[CSVColumns.carid.index]));
//...
return c;
}
}
class ResultSetCarFactory implements CarDataSource {
private final ResultSet rs;
public ResultSetCarFactory(ResultSet rs) {
this.rs = rs;
}
public Car create() {
Car c = new Car();
c.setCarId(rs.getInt("Id"));
//...
return c;
}
//...
}
组合
我不喜欢上述任何一种方法,因为它们引入了很多样板文件而没有增加太多价值。但第一种方法是有希望的,一旦你减少它。
只有一个processCar()
作为String[]
论据。但是,如果您有ResultSet
,只需将其首先转换为String[]
,将列提取到数组中的后续项目中:
public String[] toStringArray(ResultSet rs)
另一个方向的翻译,即ResultSet
基本格式也是可能的,但ResultSet
单独实现要困难得多。