(免责声明:此问题不是特定于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;
}
单身人士与全球变量相关联;在这种情况下,没有国家。
单身人士也与硬编码的依赖关联。在这种情况下,有必要了解具体类型。
答案 0 :(得分:2)
在这种情况下,我会说不。在你提出的模式中,只有一个FooTemplate,它将在多个控件,页面和线程之间共享。您必须非常小心,模板不包含任何请求或用户特定信息,并且还要同步任何方法调用。它更容易,并且每次实例化它的性能稍差。
我认为这样做的唯一原因是实例化控件需要很长时间。在这种情况下,我会使用工厂模式,其中任何初始化都进行一次,但每次都将所有数据复制到新实例中。
答案 1 :(得分:1)
如果您只想为控件创建一次模板,则可以使用延迟初始化来实现几乎相同的效果。
private ITemplate defaultTemplate;
public override ITemplate CreateDefaultTemplate()
{
if (defaultTemplate == null)
{
defaultTemplate = new FooTemplate();
}
return defaultTemplate;
}
如果您确定在应用程序中只需要任何特定对象的一个实例,则应该只使用Singleton实现。
答案 2 :(得分:0)
您真的想要为模板控件使用完全相同的实例吗?我们可能需要更多关于您要完成的内容的信息。 TemplatedControl
在同一个应用程序中使用了多少个位置?