工廠接口定義
/// <summary>
/// 如果需要同時加載配置文件中定義的映射關(guān)系,可以按照SRP的原則定義獨立的配置類型。
/// 由該配置類型調(diào)用這兩個接口為Factory加載配置信息
/// </summary>
IFactory RegisterType<TTarget, TSource>(); // fluent interface
IFactory RegisterType<TTarget, TSource>(string name); // fluent interface
#endregion
#region factory method
TTarget Create<TTarget>();
TTarget Create<TTarget>(string name);
#endregion
}
注冊類
if (!registry.TryGetValue(targetType, out subDictionary))
{
subDictionary = new Dictionary<string, Type>();
subDictionary.Add(name, sourceType);
registry.Add(targetType, subDictionary);
}
else
{
if (subDictionary.ContainsKey(name))
throw new DuplicateKeyException(name);
subDictionary.Add(name, sourceType);
}
}
public Type this[Type targetType, string name]
{
get
{
if (targetType == null) throw new ArgumentNullException("targetType");
if (string.IsNullOrEmpty(name)) throw new ArgumentNullException("name");
if (registry.Count() == 0)
return null;
return (registry
.Where(x => x.Key == targetType)).FirstOrDefault().Value
.Where(x => string.Equals(name, x.Key))
.FirstOrDefault().Value;
}
}
public Type this[Type targetType]
{
get { return this[targetType, DefaultNmae]; }
}
}
工廠類
#region IFactory Members
public IFactory RegisterType<TTarget, TSource>()
{
registry.RegisterType(typeof(TTarget), typeof(TSource));
return this;
}
public IFactory RegisterType<TTarget, TSource>(string name)
{
registry.RegisterType(typeof(TTarget), typeof(TSource), name);
return this;
}
public TTarget Create<TTarget>()
{
return (TTarget)Activator.CreateInstance(registry[typeof(TTarget)]);
}
public TTarget Create<TTarget>(string name)
{
return (TTarget)Activator.CreateInstance(registry[typeof(TTarget), name]);
}
#endregion
}
調(diào)用
Assert.IsInstanceOfType(factory.Create<IFruit>(), typeof(Apple));
Assert.IsInstanceOfType(factory.Create<IFruit>("o"), typeof (Orange));
Assert.IsInstanceOfType(factory.Create<IVehicle>(), typeof(Bicycle));
Assert.IsInstanceOfType(factory.Create<IVehicle>("a"), typeof(Bicycle));
Assert.IsInstanceOfType(factory.Create<IVehicle>("b"), typeof(Train));
Assert.IsInstanceOfType(factory.Create<IVehicle>("c"), typeof(Car));
}
其實精髓還是在于注冊類的一個類似assembly的功能,通過字典的方式,封裝,然后通過泛型來比對實現(xiàn),或者通過配置文件傳參數(shù)過來實現(xiàn)出一個新的實例化
里面注意連貫接口,泛型,等操作
新聞熱點
疑難解答
圖片精選