java - 我可以并且是否需要避免单例模式?

标签 java design-patterns static singleton

我正在编写一个程序,其中除了许多其他内容之外,我还需要三个类,我们可以在这里称之为 writer、storage 和 reader。

写入器需要非常频繁地访问存储类,而读取器则很少,特别是与写入器相比。存储类仅用于存储写入器写入的数据。作者所做的唯一一件事就是经常写入一些短突发的数据。读取器从存储中读取写入的数据,然后刷新存储以释放一些空间供写入器写入新数据。为了给出一些数字和访问频率的概念,我们假设编写者在一分钟内多次访问存储,而读者大约每小时访问一次。

所以问题是我需要在存储类中使用单例模式还是将其声明为静态类就足够了?

另外,我如何确保当读取器类使用存储时,它在从存储中读取并刷新数据后立即释放存储资源?大多数时候,存储类应该可供编写者在其中写入数据。

单例方法看起来不错,特别是我不是来自 OOP 背景。我听说这很糟糕。

最佳答案

与往常一样,对于此类问题,我认为没有一个正确的答案。

首先,已经有 a very good answer to that question .

单例模式的典型实现依赖于包含该类的唯一实例的静态字段。我根本不喜欢这种方法,因为静态字段本质上是一个全局变量,具有其所有缺点(例如隐藏的依赖关系和增加耦合的风险,不利于可测试性)。

但是,在您描述的场景中,您只需要应用程序中的类的单个实例,从这个意义上讲,单例的更一般概念可能是一个好主意。但是,我不是通过静态变量神奇地访问它,而是将其传递给使用它的类的构造函数。 这样,类之间的依赖关系就很明显,并且会简化测试(例如,如果您想注入(inject)模拟而不是真实的类)。请参阅此处了解更多福利 constructor injection .

关于java - 我可以并且是否需要避免单例模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10118945/

相关文章:

javascript - 实现支持 JavaScript 的网站无需 JavaScript 也能运行的技术

iOS MVC - 数据类型转换发生在哪里?

dynamic - Fortran 77中的局部变量是静态的还是堆栈动态的?

java - 将图像放入.jar中

java - 如何使用斐波那契方法实现尾递归?

c++ - 多态工厂

java - 无法对非静态字段进行静态引用

java - 保存到文件后编辑的 XML 内容没有改变

java - 简单的KTable构造

java - 公共(public)静态方法 howMany