使用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;
}
}
保存数据的推荐设计是什么(静态类,或其他东西)?
好吧,您可以将缓存看作一个依赖项—并将一个实例(可能是同一个实例)传递给需要它的所有对象。这就是我在已经使用依赖注入的情况下所做的。
这将使测试那些需要缓存的类变得更容易——您可以为每个测试创建一个新的缓存,而不必担心清除现有的缓存。您还可以并行化测试,而不必担心两个测试会弄乱彼此的缓存。此外,它使缓存依赖关系更清晰。
(是否像cdhowie建议的那样使用接口来表示缓存取决于您。您不需要这样做,尽管这样做可以更好地将类与它们的依赖关系解耦。如果您的缓存非常简单,并且您不介意在测试中使用生产实现,那么可能不值得提取接口。
您将创建一些ICache
接口,该接口定义缓存提供程序所需的成员。然后允许将实例传递给SomeClass()
。如果调用者没有指定一个,您仍然可以使用默认实例(实现ICache
)。这就是依赖注入模式,本质上与单例模式完全相反。
这将允许在不更改SomeClass
的情况下替换不同的缓存机制(或者只是不同的缓存实例)。