0

以下の「BFactory」を何と呼ぶべきですか。具体的なクラスの選択が行われず、毎回オブジェクトを作成するとは限らないため、実際にはファクトリではありません。これは一種のプールですが、ユーザーは取得した B を使い終わった後にプールに返しません。キャッシュと呼ぶこともできますが、パフォーマンスは主な目的ではありません。意図は、同じ BFactory を使用しているすべての人が同じ A を渡すと、同じ B を取得することです。これは、シングルトンのように聞こえ始めます。

public class A
{
    public int MyProperty { get; set; }
}


public class B
{
    public B(A wrapped)
    {
        Wrapped = wrapped;
    }

    public A Wrapped { get; set; }
}

public class BFactory
{
    private Dictionary<A,B> _created = new Dictionary<A,B>();

    public B GetB(A a)
    {
        if (_created.ContainsKey(a) == false)
        {
            _created[a] = new B(a);
        }
        return _created[a];
    }
}

もう少し現実的な例を次に示します。

MyModel の値は、TextBlock を MyViewModel の ValueString プロパティにバインドすることにより、アプリ内の複数の場所に表示されます。ユーザーは、値をパーセントまたは小数として表示することを選択できます。1 つの場所で更新された場合は、すべての場所で更新する必要があります。

public class MyModel
{
    public int Value { get; set; }
}



public class MyViewModel
{
    private readonly MyModel _model;

    public MyViewModel(MyModel model)
    {
        _model = model;
    }

    public string ValueString 
    {
        get { return string.Format(FormatString, _model.Value); }
    }

    public string FormatString { get; set; }
}


public class MyViewModelFactory
{
    private readonly Dictionary<MyModel, MyViewModel> _created = new Dictionary<MyModel, MyViewModel>();

    public MyViewModel GetViewModel(MyModel model)
    {
        if (_created.ContainsKey(model) == false)
        {
            _created[model] = new MyViewModel(model);
        }
        return _created[model];
    }
}
4

0 に答える 0