轻量级工厂(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)来实现。