【问题标题】:What is the best design for a class that is responsible for CRUD operations on the database?负责数据库上的 CRUD 操作的类的最佳设计是什么?
【发布时间】:2020-07-02 08:44:38
【问题描述】:

我想创建一个类User,它将处理我数据库中user 表上的数据。但我不知道我是否应该将其设为 Singleton 或只是捆绑一堆静态方法。

class UserSingleton {
    private static instance;

    private UserSingleton() {
        // stablish connection and prepare statements
    }

    public static getInstance() {
        if (instance == null) {
            instance = new UserSingleton();
        }

        return instance;
    }

    public void create() {};
    public void delete() {};
    // and so on...
}

class UserStatic {
    public static initialize() {
         // Stablish connection and prepare statements. 
         // These properties would be static.
    }

    public static void create() {};
    public static void delete() {};
    // and so on...
}

我真的不知道这里最好的方法是什么,也不知道它们各自的优缺点。虽然单例类看起来更加优雅和酷,但静态类 API 会更容易使用,因为我不必实例化对象。它也像我的猫鼬,这些方法是静态的,例如:Model.create()Model.findById() 等等......

你怎么看?还是我应该以完全不同的方式来做?关于应用的一些上下文:

  • 这是一个使用 JavaFX 制作的中小型桌面应用程序
  • 数据库是 SQLite
  • 测试不是优先事项(有些人可能会指出 Singleton 不好,因为它使测试更难)

【问题讨论】:

  • 最好的方法根本不是编写它们,而是使用为您完成它的工具(例如 Spring Data 和/或 JPA)。 (另外,请确保不要将使用 static 的代码强制单例与 Spring/CDI 单例等功能单例混为一谈,其中该类只是一个普通类,但容器每次运行只制作一个副本。后者仍然很容易测试和管理。)

标签: java design-patterns architecture


【解决方案1】:

看看 JPA,Spring Data with eclipselink as implementation 或 Hibernate。如果只是出于教育目的,请查看 spring orm implementationaions。

【讨论】:

    【解决方案2】:
    1. 避免单例at any cost
    2. 您需要使用接口指定 API。 看来您有 UsersUser 可以这样定义
    interface User {
        long id();
        String name();
    }
    interface Users {
        Iterable<User> iterate();
        User create(String name);
        void delete(User user);
        Optional<User> findById(long id);
    }
    
    1. 使用普通的jdbc 或借助诸如jOOQjcabi-jdbc 之类的库来实现这些接口
    2. 避免ORM 并从数据库和SQL 的角度考虑您的业务任务。使用OOP 策略来设计您的对象以及它们如何相互协作。

    【讨论】:

      猜你喜欢
      • 2013-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-25
      • 1970-01-01
      • 2018-08-06
      • 1970-01-01
      相关资源
      最近更新 更多