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は1つだけで、複数のコントロール、ページ、スレッドで共有されます。テンプレートにリクエストやユーザー固有の情報が含まれていないことに十分注意する必要があります。また、メソッド呼び出しを同期する必要があります。毎回インスタンス化する方がはるかに簡単で、パフォーマンスが少し低下します。

私がそれをしているのを見る唯一の理由は、コントロールをインスタンス化するのに長い時間がかかるということです。その場合、初期化は1回だけ実行されますが、すべてのデータが毎回新しいインスタンスにコピーされるファクトリパターンを使用します。

于 2009-01-21T21:44:28.580 に答える
1

コントロール用にテンプレートを1回だけ作成する場合は、代わりに遅延初期化を使用して、ほぼ同じ効果を得ることができます。

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

アプリケーションで特定のオブジェクトのインスタンスを1つだけ必要とする場合にのみ、シングルトン実装を使用する必要があります。

于 2009-01-21T21:45:18.283 に答える
0

テンプレート コントロールにまったく同じインスタンスを使用しますか? あなたが達成しようとしていることについて、さらに情報が必要な場合があります。TemplatedControl同じアプリケーションで使用される場所はいくつですか?

于 2009-01-21T21:42:01.660 に答える