我是否可以避免单身模式?

时间:2012-04-12 07:04:17

标签: java design-patterns static singleton

我正在编写一个程序,在其他很多东西中我需要三个类,我们可以在这里调用编写器,存储和读取器。

Writer需要非常频繁地访问存储类,而读者却很少与编写器相比。存储类只存储数据写入器写入。作者唯一要做的就是经常写一些短暂的数据。读取器从存储中读取写入的数据,然后刷新存储空间以释放写入器写入新数据的空间。为了给出一些数字和访问频率的想法,让我们说作者在一分钟内多次访问存储器,读者大约每小时访问一次。

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

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

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

3 个答案:

答案 0 :(得分:2)

与这些问题一样,我认为没有一个正确的答案。

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

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

但是在你所描述的场景中,你只想在你的应用程序中只需要一个类的单个实例的单例的更一般的概念。但是,不是通过静态变量神奇地访问它,而是将它传递给正在使用它的类的构造函数。 这样,类之间的依赖关系是显而易见的,它将简化测试(例如,如果你想注入模拟而不是真正的类)。请点击此处了解constructor injection的更多优惠。

答案 1 :(得分:0)

  

我是否需要在存储类中使用单例模式或者是它   足以将其声明为静态类?

这些是无关的问题 Singleton是关于你应该有多少个类的实例 使用单例,您只能在程序中强制执行1个实例 如果这是你需要的,那么使用单身 其余的你应该阅读生产者/消费者模式

答案 2 :(得分:0)

基本上,单例与静态类几乎相同。在相同的情况下,两者都是坏的和好的,但单身更像是“面向对象”。在基于原型的语言中,没有真正的区别。

Singletons得到了一个糟糕的代表,因为很多人正在使用它们来代替全局变量(现在每个人都“知道”很糟糕)。以这种方式使用,单身人士与全局变量一样糟糕。如果它真的模拟了一个你可以肯定只有一个实例的对象,请使用单例。如果它理论上甚至可能将来会有另一个实例,或者它没有为特定的东西建模,那么不应该使用单例模式 - 也不应该使用静态类。

这一切与您的读者/作者问题无关;一个是,如评论所示,生产者/消费者模式,或观察者模式(取决于您如何实施它)。另一个是面向对象的基本设计问题。