做网站着用什么电脑,东营建设企业网站,郑州pc网站建设,社区网站开发需求文档简单的工厂类的一个使用场景是#xff0c; 假设有一个基类 BaseClass#xff0c; 和一系列的子类 A#xff0c; B#xff0c; C#xff0c; 工厂类根据某个参数#xff0c;例如字符串 “A”, “B”, “C” 创建出相应的子类。 举例如下#xff1a; public class Factory…简单的工厂类的一个使用场景是 假设有一个基类 BaseClass 和一系列的子类 A B C 工厂类根据某个参数例如字符串 “A”, “B”, “C” 创建出相应的子类。 举例如下 public class Factory
{public static BaseClass Create(string name){switch (name){case A: return new A();case B: return new B();case C: return new C();default: throw new ArgumentException(Wrong Name);}}
} 这里的一个问题是 当子类增加或减少时 Factory 类 需要相应的改动。 有没有办法可以只是改动子类本身 而不用修改Factory类呢 当然有这里我举一个简单的实现。 基本思想是在每个子类上附加一个 Attribute 定义如下 [AttributeUsage(AttributeTargets.Class)]
public class FactoryKeyAttribute : Attribute
{public object Key { get; set; }
} 假设我们有基类和子类实现如下 public abstract class BaseClass {}[FactoryKey(Key Standard)]
public class Standard : BaseClass {}[FactoryKey(Key Enterprise)]
public class Enterprise : BaseClass {}[FactoryKey(Key Lite)]
public class Lite : BaseClass {} 假设这些类都在同一个 Assembly中 对于不在同一个Assembly的实现会稍微复杂些工厂类需要预先加载 Key Type 的Mapping 然后根据Key创建不同的实例 实现如下 public class FactoryTKey, TBaseClass
{private static readonly IDictionaryTKey, Type TypeDict Init();private static IDictionaryTKey, Type Init(){var dict from type in Assembly.GetExecutingAssembly().GetTypes()let key (FactoryKeyAttribute)Attribute.GetCustomAttribute(type, typeof(FactoryKeyAttribute))where key ! null typeof(TBaseClass).IsAssignableFrom(type)select new { Key key, Value type };return dict.ToDictionary(kvp (TKey)kvp.Key.Key, kvp kvp.Value);}public static TBaseClass CreateInstance(TKey key){Type type;if (TypeDict.TryGetValue(key, out type)){return (TBaseClass)Activator.CreateInstance(type);}throw new ArgumentException(Incorrect Key!);}
} 使用方法也很简单 BaseClass s Factorystring, BaseClass.CreateInstance(Standard);
BaseClass l Factorystring, BaseClass.CreateInstance(Lite);
BaseClass e Factorystring, BaseClass.CreateInstance(Enterprise); 对于其他类型的Key比如 Enum 或其他类型的基类 改变Factory 的类型参数即可。转载于:https://www.cnblogs.com/oujinliang/archive/2010/01/07/1641056.html