java - 更灵活的工厂

标签 java enums factory

我目前正在为学校做一个小项目。在我的 Java 应用程序中,我需要一个数据库,并且我希望使我的应用程序能够使用不同类型的数据库。所以我目前实现了一个 txt 数据库和一个 PostgreSQL。将来应该可以添加其他数据库类型。就像 XML 或 MySQL 一样,...

为了创建数据库实例,我设计了一个使用枚举的工厂。它工作得很好,但在我看来它并不真正灵活。所以,我做了一些研究,但没有找到一个对我来说清楚的真正好的例子。

这是我的枚举:

public enum DatabaseType {
    TXT,
    SQL,
    XML;
}

这是我的工厂:

public class DatabaseFactory {      

    public Database createDatabase(DatabaseType type, String databaseName) throws DatabaseException {
        if(type.equals(DatabaseType.TXT)) {
            return new FileDatabase(databaseName);
        }else if(type.equals(DatabaseType.SQL)) {
            return new SQLDatabase(databaseName);
        }else if(type.equals(DatabaseType.XML)) {
            return new XMLDatabase(databaseName);
        }else {
            //default
            return new FileDatabase(databaseName);
        }
    }
}

我的目标是将来只编辑枚举,而不触及工厂本身。这应该给我足够的灵活性,但我不知道如何做到这一点。

最佳答案

您可以将工厂放在 enum 本身中。

public enum DatabaseType {
    TXT {
        @Override
        public Database createDatabase(String databaseName) {
            return new FileDatabase(databaseName);
        }
    },
    SQL {
        @Override
        public Database createDatabase(String databaseName) {
            return new SQLDatabase(databaseName);
        }
    },
    XML {
        @Override
        public Database createDatabase(String databaseName) {
            return new XMLDatabase(databaseName);
        }
    };

    public abstract Database createDatabase(String databaseName);
}

在 Java 中,enum 不仅仅是整数值的好名字(就像在 C 中一样)。将枚举视为具有固定数量实例的类是一种更好的方式。结合匿名类的概念,您可以为枚举中的每个值赋予特定于该值的不同属性和方法。

关于java - 更灵活的工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14005993/

相关文章:

java - 如何使用变量名正确绘制矩形

c# - 为什么在调试时而不是在运行时检查时会出现异常/从数据库映射枚举的最佳实践是什么

c++ - 我如何将以下 "class reference"机制从 Delphi 转换为 C++11?

java - 如何在 apache poi 中正确评估这个公式?

java - 使用 Java https 错误上传到 Imgur v3

java - 维护 Mule 消息

mysql - 枚举与存储角色的单独表?

c# - C# 中的枚举类型约束

javascript - 通过泛型函数动态修改 TypeScript 类

ruby-on-rails - 返回 Angular 中 Rails API 的搜索结果