管理类之间共享资源?

5

假设我有几个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;
        }
    }
}

2
请注意,您放置在静态类中的任何IDisposable资源(字体、对话框等)将被分配给您的应用程序的生命周期。这可能是您想要的;只是提供信息。 - TrueWill
这是我想要的,因为我希望资源在创建后能够永久存在,这样它们可以在第一次惰性加载后“立即”启动。 - Axarydax
如果我在同行评审中读到这段代码,我不会有任何异议(看起来很好!)。 - Andrew Garrison
1
这里有一个非常好的选项分解:http://www.yoda.arachsys.com/csharp/singleton.html - Keith Adler
2个回答

1

个人认为这种实现方式不错,但真的有必要吗?简单的方法是在需要时创建新的字体和对话框,然后在必要时将其释放,并让垃圾回收器清理它们。

您是否已经测量过简单方法是否具有明显的成本,以使其值得添加缓存共享对象的复杂性呢?


1

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

如果您正在使用Singleton,则可能希望直接初始化字体而不是使用Lazy init模式。对我来说,字体听起来相当简单,不太可能出错。但是,如果该项在构建过程中可能会失败(例如由于缺少字体文件或其他原因),则懒惰模式至少允许它在下次重试。即使静态初始化程序失败,您也无法稍后重新执行它,而无需重新启动整个应用程序。请注意限制这些重试!

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接