Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带参数的工厂模式_Java_Design Patterns - Fatal编程技术网

Java 带参数的工厂模式

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连接器进行log4j输出,并希望将日志条目发布到Postgres数据库。情况如下:

<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;
}

}