Java 带参数的工厂模式
我正在使用JDBC连接器进行log4j输出,并希望将日志条目发布到Postgres数据库。情况如下:Java 带参数的工厂模式,java,design-patterns,Java,Design Patterns,我正在使用JDBC连接器进行log4j输出,并希望将日志条目发布到Postgres数据库。情况如下: <Jdbc name="Jdbc" tableName="log"> <ConnectionFactory class="database.ConnectionFactory" method="getConnection"/> <Column name="event_date" isEventTimestamp="true" /> &l
<Jdbc name="Jdbc" tableName="log">
<ConnectionFactory class="database.ConnectionFactory" method="getConnection"/>
<Column name="event_date" isEventTimestamp="true" />
<Column name="level" pattern="%level" isUnicode="false" />
<Column name="logger" pattern="%logger" isUnicode="false" />
<Column name="message" pattern="%message" isUnicode="false" />
<Column name="exception" pattern="%ex{full}" isUnicode="false" />
</Jdbc>
我的问题是,我想通过参数(主机、端口、数据库等)创建到数据库的连接,而不想硬编码。另外,拥有一个保存配置的静态类也不是首选,因为我希望能够轻松地对其进行单元测试
实现这一目标的好解决方案是什么?我可能忽略了什么,或者这是一种不好的做法吗?工厂方法可以获取参数。工厂方法可以获取参数。使用反射和枚举可以帮助: 我已经为自己实现了类似的功能:
public class BusFactory {
public IBus createBus(BusType busType, String busUrl) {
try {
if(busType == null){
return null;
}
//Touraj: Get Bus By Reflection
Class<?> busClass = Class.forName(busType.getFullQualifiedName());
Constructor con = busClass.getConstructor(String.class);
Object busObj = con.newInstance(busUrl);
if (busObj instanceof ETCDBus) {
return (ETCDBus)busObj;
} else if (busObj instanceof AeroSpikeBus) {
return (AeroSpikeBus)busObj;
}else
{
throw new UnsupportedBusException("this Type of Bus is not Supported");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (UnsupportedBusException e) {
e.printStackTrace();
}
return null;
}
}
使用反射和枚举可以帮助: 我已经为自己实现了类似的功能:
public class BusFactory {
public IBus createBus(BusType busType, String busUrl) {
try {
if(busType == null){
return null;
}
//Touraj: Get Bus By Reflection
Class<?> busClass = Class.forName(busType.getFullQualifiedName());
Constructor con = busClass.getConstructor(String.class);
Object busObj = con.newInstance(busUrl);
if (busObj instanceof ETCDBus) {
return (ETCDBus)busObj;
} else if (busObj instanceof AeroSpikeBus) {
return (AeroSpikeBus)busObj;
}else
{
throw new UnsupportedBusException("this Type of Bus is not Supported");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (UnsupportedBusException e) {
e.printStackTrace();
}
return null;
}
}
谢谢你的回答。虽然这在一般情况下是正确的,但在这种情况下,我将有一个连接池,我不想每次调用
getConnection()
时都重新创建它,因为这会破坏整个池的概念。因此,我认为我不应该将创建连接池的参数传递到此方法中。谢谢您的回答。虽然这在一般情况下是正确的,但在这种情况下,我将有一个连接池,我不想每次调用getConnection()
时都重新创建它,因为这会破坏整个池的概念。因此,我认为我不应该将创建连接池的参数传递到这个方法中。
public enum BusType {
ETCD("BUS.ETCDBus"),
AEROSPIKE("AEROSPIKE"),
RAIMA("RAIMA"),
HANA("HANA"),
GEODE("GEODE"),
IGNITE("IGNITE"),
SENTINEL("SENTINEL"),
REDIS("BUS.RedisBus"),
Informix("Informix");
private String fullQualifiedName;
BusType(String fullQualifiedName) {
this.fullQualifiedName = fullQualifiedName;
}
public String getFullQualifiedName() {
return fullQualifiedName;
}
}