我的工厂类如下:
class SomeFactory
{
private Dictionary<string, Boo> cache;
private Timer cleanup;
SomeFactory()
{
cache = new Dictionary<string, Boo>();
cleanup = new Timer(60 * 1000);
cleanup += (object sender, EventArgs e) => { cache.Clear(); }
cleanup.Start();
}
public Boo GetBoo(string serial, int year)
{
if (!cache.ContainsKey(serial))
{
Boo boo = new Boo(serial, year);
boo.inject(...); // some stuff
cache.Add(serial, boo);
}
return cache[serial];
}
...
}
您是否可以看到我缓存创建的Boo
个实例。通常Boo
是必要的,当用户想要快速查看,然后可以是免费的。实际上只编辑了Book
的一个实例,并且应该存储很长时间。经过长时间使用应用程序后,可能会有很多未使用的Boo
个对象。有一种设计模式可以应对这种情况吗?我的清理代码有多糟糕?
答案 0 :(得分:1)
根据您的环境(特定的Web应用程序和服务),有一些特殊的方法可以进行缓存。实例的生命周期,变量范围和线程级别分离只会使这一点成为必需。
假设一个简单的本地应用程序,通常的缓存方法是使用Weak references。强引用阻止GC收集此实例。弱引用没有。但是你可以尝试从他们那里获得一个StrongReference。在这一点上,将会发生以下两件事之一: