代码之家  ›  专栏  ›  技术社区  ›  Bryan Watts

这是单身汉的合法使用吗?

  •  0
  • Bryan Watts  · 技术社区  · 16 年前

    ( 免责声明: 特定于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;
    }
    

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

    3 回复  |  直到 16 年前
        1
  •  2
  •   Robert Wagner    16 年前

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

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

        2
  •  1
  •   tvanfosson    16 年前

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

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

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

        3
  •  0
  •   Andrew Hare    16 年前

    是否确实要为模板控件使用完全相同的实例?我们可能需要更多关于您试图实现的目标的信息。有多少个地方 TemplatedControl 是否在同一应用程序中使用?