管理类之间的共享资源?

Axa*_*dax 5 .net c# resources lazy-loading

想象一下,我有几个用于显示文本的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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Jen*_*uak 1

对于您希望创建一次然后重复使用的项目,有两种相关模式:单例和缓存。如果您将永远重复使用该项目,那么单例就可以了。分配给该实例的内存永远不会被清除。如果您将重新使用该项目一段时间,但可能几天内不会使用该功能,我建议使用缓存。然后当该项目不再使用时可以清除内存。

如果您使用 Singleton,您可能只想直接初始化字体,而不是使用 Lazy init 模式。对我来说,字体听起来很简单,而且不太可能出错。但是,如果该项目在构建过程中可能会失败(可能是由于缺少字体文件或其他原因),那么惰性模式至少允许它下次重试。即使失败,您以后也无法在不重新启动整个应用程序的情况下重做静态初始化程序。请注意限制重试次数!

最后,您的类“ViewerStatic”的名称引起了关注。有一种反模式称为“上帝”对象。我称之为“桶”。如果你创造了它,东西就会来。你很快就会发现各种各样的东西被倾倒在桶里。您的 ViewerStatic 类将变得巨大。最好有一个名为“FontFlyWeights”的类,然后再有一个名为“ConstantStrings”或“SystemDialogFactory”...等等。