想象一下,我有几个用于显示文本的Viewer组件,并且它们具有用户可以切换的几种模式(用于查看文本/二进制/十六进制的不同字体预设)。 管理共享对象的最佳方法是什么 - 例如字体,查找对话框等?我认为使用延迟初始化对象的静态类可以,但这可能是错误的想法。
static class ViewerStatic
{
private static Font monospaceFont;
public static Font MonospaceFont
{
get
{
if (monospaceFont == null)
//TODO read font settings from configuration
monospaceFont = new Font(FontFamily.GenericMonospace, 9, FontStyle.Bold);
return monospaceFont;
}
}
private static Font sansFont;
public static Font SansFont
{
get
{
if (sansFont == null)
//TODO read font settings from configuration
sansFont = new Font(FontFamily.GenericSansSerif, 9, FontStyle.Bold);
return sansFont;
}
}
}
答案 0 :(得分:1)
这对我来说似乎很好,但它真的有必要吗?简单的方法是在需要时创建新的字体和对话框,然后在必要时处理它们并让垃圾收集器清理它们。
您是否测量过这种简单的方法是否具有明显的成本,从而增加了缓存共享对象的复杂性?
答案 1 :(得分:1)
对于您希望创建一次然后重新使用的项目,有两种相关模式:Singleton和Cache。如果你将永远重复使用该项目,单身人士就可以了。分配给该实例的内存永远不会被清除。如果您将重新使用该项目一段时间,但可能该功能将在几天内不会使用,我建议使用缓存。然后,当项目不再使用时,可以清除内存。
如果您使用的是Singleton,您可能只想直接初始化字体而不是使用Lazy init模式。对我来说,字体听起来非常简单,不太可能出错。但是,如果项目在构造期间可能失败(可能是由于缺少字体文件或其他东西),那么懒惰模式至少允许它下次重试。如果不重新启动整个应用程序,即使失败也无法重做静态初始化程序。小心限制重试!
最后,您的类“ViewerStatic”的名称引起了关注。有一种被称为“上帝”对象的反模式。我称之为“桶”。如果你创造它,东西就会来。你很快就会发现各种东西被丢弃在桶里。您的ViewerStatic类将变得庞大。最好有一个名为“FontFlyWeights”的类,然后是另一个名为“ConstantStrings”或“SystemDialogFactory”......等等。