輕量級工廠(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
)來實現。