0

免责声明:这个问题不是特定于 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();
    }
}

我的问题是:单身人士在这里是否合适?

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

单例与全局变量相关联;在这种情况下,没有状态。

单例也与硬编码的依赖关系相关联。在这种情况下,需要了解特定类型。

4

3 回答 3

2

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

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

于 2009-01-21T21:44:28.580 回答
1

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

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

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

于 2009-01-21T21:45:18.283 回答
0

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

于 2009-01-21T21:42:01.660 回答