使用singleton进行缓存

本文关键字:缓存 singleton 使用 | 更新日期: 2023-09-27 18:06:55

我最近读到单例是一种反模式,除非真的需要,否则不应该使用。

在我们所有的项目中,我们使用单例模式来保存一些缓存数据。例如:

class SomeClass
{
   public SomeClass()
   {
       var somedata = Singleton.Instance.GetSomeData(stringRepresintation); // or like that
       var someData = Singleton.Instance.SomeData;
   }      
}

保存数据的推荐设计是什么(静态类,或其他东西)?

使用singleton进行缓存

好吧,您可以将缓存看作一个依赖项—并将一个实例(可能是同一个实例)传递给需要它的所有对象。这就是我在已经使用依赖注入的情况下所做的。

这将使测试那些需要缓存的类变得更容易——您可以为每个测试创建一个新的缓存,而不必担心清除现有的缓存。您还可以并行化测试,而不必担心两个测试会弄乱彼此的缓存。此外,它使缓存依赖关系更清晰。

(是否像cdhowie建议的那样使用接口来表示缓存取决于您。您不需要这样做,尽管这样做可以更好地将类与它们的依赖关系解耦。如果您的缓存非常简单,并且您不介意在测试中使用生产实现,那么可能不值得提取接口。

您将创建一些ICache接口,该接口定义缓存提供程序所需的成员。然后允许将实例传递给SomeClass()。如果调用者没有指定一个,您仍然可以使用默认实例(实现ICache)。这就是依赖注入模式,本质上与单例模式完全相反。

这将允许在不更改SomeClass的情况下替换不同的缓存机制(或者只是不同的缓存实例)。