java - 带参数的工厂模式

标签 java design-patterns

我正在使用 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>

据我了解,这需要一个带有方法 getConnection 的静态类,我使用工厂模式实现了它:

public class ConnectionFactory {
    private static interface Singleton {
        final ConnectionFactory INSTANCE = new ConnectionFactory();
    }

    private ComboPooledDataSource comboPooledDataSource;

    private ConnectionFactory() {
        comboPooledDataSource = new ComboPooledDataSource();
        try {
            // Load the jdbc driver.
            comboPooledDataSource.setDriverClass("org.postgresql.Driver");
        } catch (PropertyVetoException exception) {

        }

        // Need to create datasource here, requires parameters.
    }

    public static Connection getConnection() throws SQLException {
        return Singleton.INSTANCE.comboPooledDataSource.getConnection();
    }
}

我的问题是,我想通过参数(主机、端口、数据库等)创建与数据库的连接,并且不想对其进行硬编码。另外,拥有一个保存配置的静态类也不是首选,因为我希望能够轻松地对其进行单元测试。

什么是实现这一目标的好解决方案?我是否可能忽略了某些事情或者这是一种不好的做法?

最佳答案

工厂方法可以接受参数。

关于java - 带参数的工厂模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44191218/

相关文章:

c# - 单独的选项类、重载构造函数或具有默认值的公共(public)属性?

Android - 复杂的数据库和内容提供者

C# 设计 - 如何在没有空接口(interface)的情况下将类和枚举分组到列表中?

c# - 创建松散耦合/可扩展的软件架构

java - 从 yyyy-mm-dd 获取当前月份

java - Android ByteArrayBuffer 持有的字节多于容量

java - 在 Mac OS X 上,移动光标有时不显示在焦点上

java - 如何锁定 Java 线程,以便在 Platform.runLater 完成之前锁定其他线程

java - 如何以编程方式根据 Java 中的 Json 模式验证 Json 字符串?

java - 设计问题: Dynamically changing GUI -> sending implementation classes as soap attachments