輕量級工廠(C)

簡單來說:

一個飛錘工廠 ,對於一個給定的,已知的,關鍵總會給同一物件的響應。對於新金鑰,將建立例項並將其返回。

使用工廠:

ISomeFactory<string, object> factory = new FlyweightFactory<string, object>();

var result1 = factory.GetSomeItem("string 1");
var result2 = factory.GetSomeItem("string 2");
var result3 = factory.GetSomeItem("string 1");

//Objects from different keys
bool shouldBeFalse = result1.Equals(result2);

//Objects from same key
bool shouldBeTrue = result1.Equals(result3);

執行:

public interface ISomeFactory<TKey,TResult> where TResult : new()
{
    TResult GetSomeItem(TKey key);
}

public class FlyweightFactory<TKey, TResult> : ISomeFactory<TKey, TResult> where TResult : new()
{
    public TResult GetSomeItem(TKey key)
    {
        TResult result;
        if(!Mapping.TryGetValue(key, out result))
        {
            result = new TResult();
            Mapping.Add(key, result);
        }
        return result;
    }

    public Dictionary<TKey, TResult> Mapping { get; set; } = new Dictionary<TKey, TResult>();
}

額外說明

我建議在此解決方案中新增 IoC Container 的使用(如此處的不同示例中所述),而不是建立自己的新例項。可以通過向容器新增 TResult 的新註冊然後從中解析(而不是示例中的 dictionary)來實現。