这是单身人士的合法使用吗?

时间:2009-01-21 21:35:59

标签: c# singleton

免责声明:此问题不是特定于ASP.NET)

我有一个可能模板化的控件,类似于登录控件:

public abstract class TemplatedControl : CompositeControl
{
    public ITemplate Template { get; set; }

    protected override void CreateChildControls()
    {
        var template = this.Template ?? CreateDefaultTemplate();

        // ...
    }

    protected virtual ITemplate CreateDefaultTemplate()
    {
        return null;
    }
}

模板化控件看起来像:

public class FooControl : TemplatedControl
{
    public override ITemplate CreateDefaultTemplate()
    {
        return new FooTemplate();
    }
}

我的问题是:在这里,Singleton是否合适?

public override ITemplate CreateDefaultTemplate()
{
    return FooTemplate.Instance;
}

单身人士与全球变量相关联;在这种情况下,没有国家。

单身人士也与硬编码的依赖关联。在这种情况下,有必要了解具体类型。

3 个答案:

答案 0 :(得分:2)

在这种情况下,我会说不。在你提出的模式中,只有一个FooTemplate,它将在多个控件,页面和线程之间共享。您必须非常小心,模板不包含任何请求或用户特定信息,并且还要同步任何方法调用。它更容易,并且每次实例化它的性能稍差。

我认为这样做的唯一原因是实例化控件需要很长时间。在这种情况下,我会使用工厂模式,其中任何初始化都进行一次,但每次都将所有数据复制到新实例中。

答案 1 :(得分:1)

如果您只想为控件创建一次模板,则可以使用延迟初始化来实现几乎相同的效果。

private ITemplate defaultTemplate;
public override ITemplate CreateDefaultTemplate()
{
     if (defaultTemplate == null)
     {
         defaultTemplate = new FooTemplate();
     }
     return defaultTemplate;
}

如果您确定在应用程序中只需要任何特定对象的一个​​实例,则应该只使用Singleton实现。

答案 2 :(得分:0)

您真的想要为模板控件使用完全相同的实例吗?我们可能需要更多关于您要完成的内容的信息。 TemplatedControl在同一个应用程序中使用了多少个位置?